แปลงคอลัมน์ Pandas เป็น DateTime


241

ฉันมีหนึ่งฟิลด์ใน DataFrame แพนด้าที่ถูกอิมพอร์ตเป็นรูปแบบสตริง มันควรจะเป็นตัวแปร datetime ฉันจะแปลงเป็นคอลัมน์วันที่และเวลาแล้วกรองตามวันที่

ตัวอย่าง:

  • ชื่อDataFrame : raw_data
  • ชื่อคอลัมน์: Mycol
  • รูปแบบค่าในคอลัมน์: '05SEP2014: 00: 00: 00.000'

คำตอบ:


430

ใช้to_datetimeฟังก์ชั่นระบุรูปแบบเพื่อให้ตรงกับข้อมูลของคุณ

raw_data['Mycol'] =  pd.to_datetime(raw_data['Mycol'], format='%d%b%Y:%H:%M:%S.%f')

70
หมายเหตุ: formatไม่จำเป็นต้องมีอาร์กิวเมนต์ to_datetimeเป็นคนฉลาด ไปข้างหน้าและลองโดยไม่พยายามจับคู่ข้อมูลของคุณ
samthebrand

6
เพื่อหลีกเลี่ยงการSettingWithCopyWarningใช้ @ darth-behfans stackoverflow.com/a/42773096/4487805
Álvaro Loza

3
ถ้าคุณแค่ต้องการเวลาและไม่ใช่วันที่
FaCoffee

5
ไม่สมาร์ทชะมัด แม้ว่าคอลัมน์บางคอลัมน์ในรูปแบบ dayfirst = True จะยังคงเป็นค่าเริ่มต้นเป็น dayfirst = False สำหรับคอลัมน์อื่น ๆ ในคอลัมน์เดียวกัน ดังนั้นปลอดภัยกว่าที่จะใช้การกำหนดรูปแบบที่ชัดเจนหรืออย่างน้อยพารามิเตอร์ dayfirst
CPBL

10
การข้ามสตริงรูปแบบอาจทำให้การดำเนินการนี้ช้าลงด้วยเรคคอร์ดจำนวนมาก คำตอบนี้อธิบายถึงสาเหตุ ดูเหมือนว่าinfer_datetime_format=Trueจะสามารถเพิ่มความเร็วในการวิเคราะห์คำได้ถึง ~ 5-10x (ตามเอกสารของแพนด้า) หากคุณไม่รวมสตริงรูปแบบ
atwalsh

52

คุณสามารถใช้วิธี DataFrame .apply()เพื่อทำงานกับค่าใน Mycol:

>>> df = pd.DataFrame(['05SEP2014:00:00:00.000'],columns=['Mycol'])
>>> df
                    Mycol
0  05SEP2014:00:00:00.000
>>> import datetime as dt
>>> df['Mycol'] = df['Mycol'].apply(lambda x: 
                                    dt.datetime.strptime(x,'%d%b%Y:%H:%M:%S.%f'))
>>> df
       Mycol
0 2014-09-05

1
ขอบคุณ! นี่เป็นสิ่งที่ดีเพราะใช้ได้อย่างกว้างขวางกว่า แต่คำตอบอื่น ๆ ก็ตรงกว่า ฉันมีช่วงเวลาที่ยากลำบากในการตัดสินใจเลือกสิ่งที่ฉันชอบมากขึ้น :)
Chris

2
ฉันชอบคำตอบนี้ดีกว่าเพราะมันสร้างวัตถุ datetime ซึ่งตรงข้ามกับ pandas.tslib.Timestamp วัตถุ
wesanyer

25

หากคุณมีการแปลงมากกว่าหนึ่งคอลัมน์คุณสามารถทำสิ่งต่อไปนี้:

df[["col1", "col2", "col3"]] = df[["col1", "col2", "col3"]].apply(pd.to_datetime)

15
raw_data['Mycol'] =  pd.to_datetime(raw_data['Mycol'], format='%d%b%Y:%H:%M:%S.%f')

ใช้งานได้ แต่จะส่งผลให้คำเตือน Python ของค่าพยายามที่จะตั้งค่าบนสำเนาของชิ้นจาก DataFrame ลองใช้.loc[row_indexer,col_indexer] = valueแทน

ฉันเดาว่านี่เป็นเพราะการจัดทำดัชนีการผูกมัด


2
ลองใช้งานสักสองสามครั้ง แต่ก็ใช้งานได้: raw_data.loc [:, 'Mycol'] = pd.to_datetime (raw_data ['Mycol'], รูปแบบ = '% d% b% Y:% H:% M:% S .% f ')
pinegulf

9

ใช้to_datetimeฟังก์ชันแพนด้าเพื่อแยกคอลัมน์เป็น DateTime นอกจากนี้โดยใช้infer_datetime_format=Trueมันจะตรวจจับรูปแบบโดยอัตโนมัติและแปลงคอลัมน์ที่กล่าวถึงเป็น DateTime

import pandas as pd
raw_data['Mycol'] =  pd.to_datetime(raw_data['Mycol'], infer_datetime_format=True)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.