Chuyển đổi cột Pandas thành DateTime


241

Tôi có một trường trong DataFrame gấu trúc được nhập dưới dạng chuỗi. Nó phải là một biến datetime. Làm cách nào để chuyển đổi nó thành cột datetime và sau đó lọc dựa trên ngày.

Thí dụ:

  • Tên khung dữ liệu: khung dữ liệu raw_data
  • Tên cột dọc: Mycol
  • Định dạng giá trị trong Cột: '05SEP2014: 00: 00: 00.000'

Câu trả lời:


430

Sử dụng to_datetimechức năng, chỉ định một định dạng để phù hợp với dữ liệu của bạn.

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

70
Lưu ý: formatđối số không bắt buộc. to_datetimethông minh. Đi trước và thử nó mà không cố gắng để phù hợp với dữ liệu của bạn.
samthebrand

6
Để tránh việc SettingWithCopyWarningsử dụng @ darth-Behfans stackoverflow.com/a/42773096/4487805
Álvaro Loza

3
Nếu bạn chỉ muốn thời gian và không hẹn hò thì sao?
FaCoffee

5
Không thông minh khủng khiếp. Ngay cả khi một số cột rõ ràng ở định dạng dayfirst = True, nó vẫn sẽ được mặc định là dayfirst = false cho các cột khác trong cùng một cột. Vì vậy, an toàn hơn để sử dụng một đặc tả định dạng rõ ràng hoặc ít nhất là tham số ban ngày.
CPBL

10
Việc bỏ qua chuỗi định dạng có thể khiến thao tác này bị chậm với nhiều bản ghi. Câu trả lời này thảo luận tại sao. Có vẻ như infer_datetime_format=Truecũng có thể tăng tốc độ phân tích cú pháp lên tới ~ 5-10 lần (theo tài liệu của gấu trúc) nếu bạn không bao gồm chuỗi định dạng.
atwalsh

52

Bạn có thể sử dụng phương thức DataFrame .apply()để hoạt động trên các giá trị trong 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
Cảm ơn! Điều này là tốt bởi vì nó được áp dụng rộng rãi hơn nhưng câu trả lời khác là trực tiếp hơn. Tôi đã có một thời gian khó khăn để quyết định rằng tôi thích cái nào hơn :)
Chris

2
Tôi thích câu trả lời này hơn, bởi vì nó tạo ra một đối tượng datetime trái ngược với một đối tượng
pandas.tslib.Timestamp

25

Nếu bạn có nhiều hơn một cột được chuyển đổi, bạn có thể làm như sau:

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')

hoạt động, tuy nhiên, nó dẫn đến cảnh báo Python về giá trị A đang cố gắng được đặt trên một bản sao của một lát cắt từ DataFrame. Hãy thử sử dụng .loc[row_indexer,col_indexer] = valuethay thế

Tôi đoán điều này là do một số chỉ số chuỗi.


2
Đã thử cho tôi một vài lần thử, nhưng điều này hoạt động: raw_data.loc [:, 'Mycol'] = pd.to_datetime (raw_data ['Mycol'], format = '% d% b% Y:% H:% M:% S .% f ')
pinegulf

9

Sử dụng to_datetimehàm gấu trúc để phân tích cột dưới dạng DateTime. Ngoài ra, bằng cách sử dụng infer_datetime_format=True, nó sẽ tự động phát hiện định dạng và chuyển đổi cột được đề cập thành DateTime.

import pandas as pd
raw_data['Mycol'] =  pd.to_datetime(raw_data['Mycol'], infer_datetime_format=True)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.