我有一个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
本质上相当于@waitingkuo,但我会在这里使用 to_datetime (看起来更清洁,并提供一些额外的功能,例如 dayfirst ):
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
我想很多数据都是从CSV文件进入Pandas的,在这种情况下,您可以在初始CSV读取期间简单地转换日期:
dfcsv = pd.read_csv('xyz.csv', parse_dates=[0]) 其中0表示日期所在的列 .如果您希望将日期作为索引,也可以在其中添加 , index_col=0 .
dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])
, index_col=0
见http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html
现在你可以做 df['column'].dt.date
df['column'].dt.date
请注意,对于datetime对象,如果你没有看到它们都是00:00:00的小时,那就不是pandas . 这是iPython笔记本试图让事情看起来很漂亮 .
情况可能是日期需要转换为不同的频率 . 在这种情况下,我建议按日期设置索引 .
#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'>
5 回答
使用astype
本质上相当于@waitingkuo,但我会在这里使用
to_datetime
(看起来更清洁,并提供一些额外的功能,例如dayfirst
):我想很多数据都是从CSV文件进入Pandas的,在这种情况下,您可以在初始CSV读取期间简单地转换日期:
dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])
其中0表示日期所在的列 .如果您希望将日期作为索引,也可以在其中添加
, index_col=0
.见http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html
现在你可以做
df['column'].dt.date
请注意,对于datetime对象,如果你没有看到它们都是00:00:00的小时,那就不是pandas . 这是iPython笔记本试图让事情看起来很漂亮 .
情况可能是日期需要转换为不同的频率 . 在这种情况下,我建议按日期设置索引 .
在此之后,您可以更轻松地转换为您最需要的日期格式类型 . 下面,我按顺序转换为多种日期格式,最终以月初的一组日期日期结束 .
为简洁起见,我没有表明我在上面的每一行之后运行以下代码:
这给了我以下输出: