我正在尝试使用pandas.DataFrame
将pandas.to_datetime()
的索引从字符串格式转换为日期时间索引。
导入pandas:
In [1]: import pandas as pd
In [2]: pd.__version__
Out[2]: '0.10.1'
创建一个示例DataFrame:
In [3]: d = {'data' : pd.Series([1.,2.], index=['26/12/2012', '10/01/2013'])}
In [4]: df=pd.DataFrame(d)
看看指数。请注意,日期格式为日/月/年:
In [5]: df.index
Out[5]: Index([26/12/2012, 10/01/2013], dtype=object)
将索引转换为日期时间:
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
在此阶段,您可以看到每个条目的日期格式的格式不同。第一个很好,第二个月和天交换。
这是我想写的,但避免日期字符串的格式不一致:
In [7]: df.set_index(pd.to_datetime(df.index))
Out[7]:
data
2012-12-26 1
2013-10-01 2
我猜第一个条目是正确的,因为函数'知道'没有26个月,所以不选择默认的月/日/年格式。
还有其他/更好的方法吗?我可以将格式传递到to_datetime()
函数吗?
谢谢。
编辑:
我找到了一种方法,没有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
但它有点乱。欢迎任何改进。
答案 0 :(得分:5)
to_datetime
有(隐藏?)dayfirst
参数:
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
在pandas 0.11(之后)中,您将能够使用format
参数:
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