ฉันจะแปลงวันที่ในเฟรมข้อมูล Pandas เป็นประเภทข้อมูล 'วันที่' ได้อย่างไร


108

ฉันมีกรอบข้อมูล Pandas หนึ่งในคอลัมน์มีสตริงวันที่ในรูปแบบ YYYY-MM-DD

สำหรับเช่น '2013-10-28'

ในขณะที่ของคอลัมน์dtypeobject

ฉันจะแปลงค่าคอลัมน์เป็นรูปแบบวันที่ของ Pandas ได้อย่างไร

คำตอบ:


115

ใช้astype

In [31]: df
Out[31]: 
   a        time
0  1  2013-01-01
1  2  2013-01-02
2  3  2013-01-03

In [32]: df['time'] = df['time'].astype('datetime64[ns]')

In [33]: df
Out[33]: 
   a                time
0  1 2013-01-01 00:00:00
1  2 2013-01-02 00:00:00
2  3 2013-01-03 00:00:00

1
ดี - ขอบคุณ - ฉันจะกำจัด 00:00:00 ในตอนท้ายของแต่ละวันได้อย่างไร
user7289

1
การประทับเวลาของแพนด้ามีทั้งวันที่และเวลา คุณหมายถึงแปลงเป็น python date object หรือเปล่า?
waitingkuo

7
คุณสามารถแปลงได้โดยdf['time'] = [time.date() for time in df['time']]
waitingkuo

3
[ns] หมายถึงอะไรคุณสามารถกำหนดให้สตริงข้อความเป็นวันที่และลบส่วนเวลาของวันที่นั้นได้หรือไม่
yoshiserry

1
@yoshiserry เป็นนาโนวินาทีและเป็นวิธีการจัดเก็บวันที่ไว้ภายใต้ประทุนเมื่อแปลงอย่างถูกต้อง (เวลาในหน่วยนาโนวินาที)
Andy Hayden

119

โดยพื้นฐานแล้วเทียบเท่ากับ @waitingkuo แต่ฉันจะใช้to_datetimeที่นี่ (ดูเหมือนจะสะอาดกว่าเล็กน้อยและมีฟังก์ชันเพิ่มเติมบางอย่างเช่นdayfirst):

In [11]: df
Out[11]:
   a        time
0  1  2013-01-01
1  2  2013-01-02
2  3  2013-01-03

In [12]: pd.to_datetime(df['time'])
Out[12]:
0   2013-01-01 00:00:00
1   2013-01-02 00:00:00
2   2013-01-03 00:00:00
Name: time, dtype: datetime64[ns]

In [13]: df['time'] = pd.to_datetime(df['time'])

In [14]: df
Out[14]:
   a                time
0  1 2013-01-01 00:00:00
1  2 2013-01-02 00:00:00
2  3 2013-01-03 00:00:00

การจัดการValueErrors
ถ้าคุณทำงานเป็นสถานการณ์ที่ทำ

df['time'] = pd.to_datetime(df['time'])

พ่น

ValueError: Unknown string format

นั่นหมายความว่าคุณมีค่าที่ไม่ถูกต้อง (ไม่บังคับ) หากคุณพอใจที่จะให้พวกเขาแปลงเป็นpd.NaTคุณสามารถเพิ่มerrors='coerce'อาร์กิวเมนต์ในto_datetime:

df['time'] = pd.to_datetime(df['time'], errors='coerce')

สวัสดีพวกคุณ @AndyHayden คุณสามารถลบช่วงเวลาออกจากวันที่ได้หรือไม่? ฉันไม่ต้องการส่วนนั้น?
yoshiserry

ใน 0.13.1 ของแพนด้าจะไม่มีการแสดง 00: 00: 00s
Andy Hayden

แล้วในเวอร์ชันอื่น ๆ เราจะลบ / และไม่แสดงได้อย่างไร?
yoshiserry

ฉันไม่คิดว่าจะทำได้ในทางที่ดีมีการสนทนาเพื่อเพิ่ม date_format เช่น float_format (ที่คุณเคยเห็น) ฉันขอแนะนำให้อัปเกรดอยู่แล้ว
Andy Hayden

ปัญหาของฉันคือวันที่ของฉันอยู่ในรูปแบบนี้ ... 41516.43 และฉันได้รับข้อผิดพลาดนี้ ฉันคาดหวังว่ามันจะกลับมาเช่น 2014-02-03 ในคอลัมน์ใหม่! ข้อผิดพลาด: # แปลงค่าวันที่ในคอลัมน์ "load_date" เป็นวันที่ budget_dataset ['date_last_load'] = pd.to_datetime (budget_dataset ['load_date']) budget_dataset -c: 2: SettingWithCopyWarning: ค่าพยายามตั้งค่าบน a สำเนาของชิ้นส่วนจาก DataFrame ลองใช้. loc [row_index, col_indexer] = value แทน
yoshiserry

38

ฉันนึกภาพว่าข้อมูลจำนวนมากเข้ามาใน Pandas จากไฟล์ CSV ซึ่งในกรณีนี้คุณสามารถแปลงวันที่ในระหว่างการอ่าน CSV ครั้งแรก:

dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])โดยที่ 0 หมายถึงคอลัมน์ที่มีวันที่
คุณสามารถเพิ่ม, index_col=0ในนั้นได้หากคุณต้องการให้วันที่เป็นดัชนีของคุณ

ดูhttps://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html


ขอบคุณนั่นคือสิ่งที่ฉันต้องการ แม้ว่าเอกสารดังกล่าวจะย้ายไปแล้ว แต่คุณสามารถดูได้ที่นี่: pandas.pydata.org/pandas-docs/stable/reference/api/…
Sastibe

24

ตอนนี้คุณสามารถทำได้ df['column'].dt.date

โปรดทราบว่าสำหรับออบเจ็กต์วันที่และเวลาหากคุณไม่เห็นชั่วโมงที่มันทั้งหมด 00:00:00 นั่นไม่ใช่แพนด้า นั่นคือโน้ตบุ๊ก iPython ที่พยายามทำให้สิ่งต่างๆดูสวยงาม


2
อันนี้ใช้ไม่ได้สำหรับฉันมันบ่น: ใช้ได้เฉพาะ. dt accessor ที่มีค่า
เหมือนข้อมูลเท่านั้น

2
คุณอาจต้องทำdf[col] = pd.to_datetime(df[col])ก่อนเพื่อแปลงคอลัมน์ของคุณเป็นวัตถุเวลาวันที่
szeitlin

1
ปัญหาของคำตอบนี้คือการแปลงคอลัมน์dtype = objectซึ่งใช้หน่วยความจำมากกว่าความเป็นจริงdatetime dtypeในแพนด้า
elPastor


7

อีกวิธีหนึ่งในการทำเช่นนี้และใช้ได้ดีหากคุณมีหลายคอลัมน์เพื่อแปลงเป็นวันที่และเวลา

cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)

คำถามขอวันที่ไม่ใช่วันที่และเวลา
Mark Andersen

@MarkAndersen ตราบเท่าที่คุณมีdateเฉพาะค่าในคอลัมน์ของคุณการแปลงเป็นวันที่และเวลาจะคงไว้ซึ่งข้อมูลเท่านั้น หากคุณแปลงความชัดเจนโดยใช้df['datetime_col'].dt.dateสิ่งนั้นจะส่งผลให้เป็นobjectdtype การสูญเสียการจัดการหน่วยความจำ
Sumanth Lazarus

1

อาจเป็นกรณีที่ต้องแปลงวันที่เป็นความถี่อื่น ในกรณีนี้ฉันขอแนะนำให้ตั้งค่าดัชนีตามวันที่

#set an index by dates
df.set_index(['time'], drop=True, inplace=True)

หลังจากนี้คุณสามารถแปลงเป็นรูปแบบวันที่ที่คุณต้องการมากที่สุดได้ง่ายขึ้น ด้านล่างนี้ฉันจะแปลงเป็นรูปแบบวันที่หลายรูปแบบตามลำดับท้ายที่สุดจะลงเอยด้วยชุดของวันที่ในแต่ละวันในช่วงต้นเดือน

#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)

#Convert to monthly dates
df.index = df.index.to_period(freq='M')

#Convert to strings
df.index = df.index.strftime('%Y-%m')

#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)

เพื่อความกะทัดรัดฉันไม่แสดงว่าฉันเรียกใช้รหัสต่อไปนี้หลังจากแต่ละบรรทัดด้านบน:

print(df.index)
print(df.index.dtype)
print(type(df.index))

สิ่งนี้ทำให้ฉันได้ผลลัพธ์ต่อไปนี้:

Index(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='object', name='time')
object
<class 'pandas.core.indexes.base.Index'>

DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='datetime64[ns]', name='time', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

PeriodIndex(['2013-01', '2013-01', '2013-01'], dtype='period[M]', name='time', freq='M')
period[M]
<class 'pandas.core.indexes.period.PeriodIndex'>

Index(['2013-01', '2013-01', '2013-01'], dtype='object')
object
<class 'pandas.core.indexes.base.Index'>

DatetimeIndex(['2013-01-01', '2013-01-01', '2013-01-01'], dtype='datetime64[ns]', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

0

ลองแปลงแถวใดแถวหนึ่งเป็นการประทับเวลาโดยใช้ฟังก์ชัน pd.to_datetime จากนั้นใช้. map เพื่อแมปฟอร์มกับคอลัมน์ทั้งหมด


0
 #   Column          Non-Null Count   Dtype         
---  ------          --------------   -----         
 0   startDay        110526 non-null  object
 1   endDay          110526 non-null  object

import pandas as pd

df['startDay'] = pd.to_datetime(df.startDay)

df['endDay'] = pd.to_datetime(df.endDay)

 #   Column          Non-Null Count   Dtype         
---  ------          --------------   -----         
 0   startDay        110526 non-null  datetime64[ns]
 1   endDay          110526 non-null  datetime64[ns]

0

เพื่อความสมบูรณ์ตัวเลือกอื่นซึ่งอาจไม่ใช่ทางเลือกที่ตรงไปตรงมาที่สุดซึ่งคล้ายกับที่ @SSS เสนอเล็กน้อย แต่การใช้ไลบรารี datetime คือ:

import datetime
df["Date"] = df["Date"].apply(lambda x: datetime.datetime.strptime(x, '%Y-%d-%m').date())
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.