2013-04-10 12 views
5

Tôi đang cố chuyển đổi chỉ mục của pandas.DataFrame từ định dạng chuỗi thành chỉ mục ngày giờ, sử dụng pandas.to_datetime().pandas.to_datetime định dạng chuỗi thời gian không nhất quán

gấu trúc nhập:

In [1]: import pandas as pd 

In [2]: pd.__version__ 
Out[2]: '0.10.1' 

Tạo một ví dụ DataFrame:

In [3]: d = {'data' : pd.Series([1.,2.], index=['26/12/2012', '10/01/2013'])} 

In [4]: df=pd.DataFrame(d) 

Nhìn vào chỉ số. Lưu ý rằng định dạng ngày là ngày/tháng/năm:

In [5]: df.index 
Out[5]: Index([26/12/2012, 10/01/2013], dtype=object) 

index Convert to datetime:

In [6]: pd.to_datetime(df.index) 
Out[6]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2012-12-26 00:00:00, 2013-10-01 00:00:00] 
Length: 2, Freq: None, Timezone: None 

Đã ở giai đoạn này, bạn có thể thấy rằng định dạng ngày cho mỗi mục đã được định dạng khác nhau . Việc đầu tiên là tốt, thứ hai đã hoán đổi tháng và ngày.

Đây là những gì tôi muốn viết, nhưng tránh các định dạng phù hợp các chuỗi date:

In [7]: df.set_index(pd.to_datetime(df.index)) 
Out[7]: 
data 
2012-12-26 1 
2013-10-01 2 

Tôi đoán mục đầu tiên là chính xác bởi vì chức năng 'biết' không có 26 tháng, vv không chọn định dạng tháng/ngày/năm mặc định.

Có cách nào khác/tốt hơn để thực hiện việc này không? Tôi có thể chuyển định dạng vào hàm to_datetime() không?

Cảm ơn bạn.

EDIT:

Tôi đã tìm thấy một cách để làm điều này, mà không pandas.to_datetime:

import datetime.datetime as dt 
date_string_list = df.index.tolist() 
datetime_list = [ dt.strptime(date_string_list[x], '%d/%m/%Y') for x in range(len(date_string_list)) ] 
df.index=datetime_list 

nhưng đó là một chút lộn xộn. Mọi cải tiến đều được chào đón.

Trả lời

5

Có (ẩn?) dayfirst lập luận để to_datetime:

In [23]: pd.to_datetime(df.index, dayfirst=True) 
Out[23]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2012-12-26 00:00:00, 2013-01-10 00:00:00] 
Length: 2, Freq: None, Timezone: None 

Trong gấu trúc 0,11 (trở đi), bạn sẽ có thể sử dụng format luận:

In [24]: pd.to_datetime(df.index, format='%d/%m/%Y') 
Out[24]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2012-12-26 00:00:00, 2013-01-10 00:00:00] 
Length: 2, Freq: None, Timezone: None 
+0

Cảm ơn @andy. 'Dayfirst' arg hoạt động. Nhưng tôi không thể sử dụng 'định dạng'. 'TypeError: to_datetime() nhận đối số từ khóa không mong muốn 'format''. Nên có sẵn trong phiên bản gấu trúc tôi đang sử dụng (0.10.1)? –

+0

@ random.me ah Xin lỗi. Nó sẽ không được, tôi đã làm việc trong dev (vì vậy nó sẽ là 0,11)! –

+0

Cảm ơn bạn điều này đã hữu ích. Tôi đang làm việc trên phiên bản 0,15 và gấu trúc vẫn còn bị nhầm lẫn nếu tôi không ăn trong tham số 'dayfirst = True' để giới thiệu' định dạng' rõ ràng đã không giúp đỡ. – Rhubarb