ฉันมีกรอบข้อมูล Pandas หนึ่งในคอลัมน์มีสตริงวันที่ในรูปแบบ YYYY-MM-DD
สำหรับเช่น '2013-10-28'
ในขณะที่ของคอลัมน์dtype
object
ฉันจะแปลงค่าคอลัมน์เป็นรูปแบบวันที่ของ Pandas ได้อย่างไร
ฉันมีกรอบข้อมูล Pandas หนึ่งในคอลัมน์มีสตริงวันที่ในรูปแบบ YYYY-MM-DD
สำหรับเช่น '2013-10-28'
ในขณะที่ของคอลัมน์dtype
object
ฉันจะแปลงค่าคอลัมน์เป็นรูปแบบวันที่ของ Pandas ได้อย่างไร
คำตอบ:
ใช้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
df['time'] = [time.date() for time in df['time']]
โดยพื้นฐานแล้วเทียบเท่ากับ @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
การจัดการValueError
s
ถ้าคุณทำงานเป็นสถานการณ์ที่ทำ
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')
ฉันนึกภาพว่าข้อมูลจำนวนมากเข้ามาใน 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
ตอนนี้คุณสามารถทำได้ df['column'].dt.date
โปรดทราบว่าสำหรับออบเจ็กต์วันที่และเวลาหากคุณไม่เห็นชั่วโมงที่มันทั้งหมด 00:00:00 นั่นไม่ใช่แพนด้า นั่นคือโน้ตบุ๊ก iPython ที่พยายามทำให้สิ่งต่างๆดูสวยงาม
df[col] = pd.to_datetime(df[col])
ก่อนเพื่อแปลงคอลัมน์ของคุณเป็นวัตถุเวลาวันที่
dtype = object
ซึ่งใช้หน่วยความจำมากกว่าความเป็นจริงdatetime dtype
ในแพนด้า
หากคุณต้องการรับรูปแบบ DATE ไม่ใช่ DATETIME:
df["id_date"] = pd.to_datetime(df["id_date"]).dt.date
อีกวิธีหนึ่งในการทำเช่นนี้และใช้ได้ดีหากคุณมีหลายคอลัมน์เพื่อแปลงเป็นวันที่และเวลา
cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)
date
เฉพาะค่าในคอลัมน์ของคุณการแปลงเป็นวันที่และเวลาจะคงไว้ซึ่งข้อมูลเท่านั้น หากคุณแปลงความชัดเจนโดยใช้df['datetime_col'].dt.date
สิ่งนั้นจะส่งผลให้เป็นobject
dtype การสูญเสียการจัดการหน่วยความจำ
อาจเป็นกรณีที่ต้องแปลงวันที่เป็นความถี่อื่น ในกรณีนี้ฉันขอแนะนำให้ตั้งค่าดัชนีตามวันที่
#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'>
ลองแปลงแถวใดแถวหนึ่งเป็นการประทับเวลาโดยใช้ฟังก์ชัน pd.to_datetime จากนั้นใช้. map เพื่อแมปฟอร์มกับคอลัมน์ทั้งหมด
# 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]
เพื่อความสมบูรณ์ตัวเลือกอื่นซึ่งอาจไม่ใช่ทางเลือกที่ตรงไปตรงมาที่สุดซึ่งคล้ายกับที่ @SSS เสนอเล็กน้อย แต่การใช้ไลบรารี datetime คือ:
import datetime
df["Date"] = df["Date"].apply(lambda x: datetime.datetime.strptime(x, '%Y-%d-%m').date())