使用pandas.to_datetime时只保留date部分
我使用pandas.to_datetime
来parsing数据中的date。 即使date全部是每日,大pandas默认代表datetime64[ns]
的date。 我想知道是否有一个优雅的/巧妙的方式将date转换为datetime.date
或datetime64[D]
以便在将数据写入CSV时,date不会附加00:00:00
。 我知道我可以手动转换types的元素:
[dt.to_datetime().date() for dt in df.dates]
但是,由于我有很多行,所以这非常慢,而这种做法pandas.to_datetime
使用pandas.to_datetime
的目的。 有没有办法一次转换整个列的dtype
? 或者, pandas.to_datetime
支持精确的规范,以便在处理日常数据时可以摆脱时间部分?
从版本0.15.0
现在可以使用.dt
轻松访问date组件:
df['just_date'] = df['dates'].dt.date
pandasDatetimeIndex
和Series
有一个名为normalize
的方法,它完全符合你的要求。
你可以在这个答案中阅读更多关于它。
它会写成ser.dt.normalize()
虽然我提出了EdChum的回答,这是对OP提出的问题的最直接的回答,但它并不能真正解决性能问题(它仍然依赖于python datetime
对象,因此对它们的任何操作都不会被vector化 – 也就是说,这将是缓慢的)。
更好的替代方法是使用df['dates'].dt.floor('d')
。 严格来说,它不会“只保留date部分”,因为它只是将时间设置为00:00:00
。 但是,它确实按照OP的要求工作,例如:
- 打印到屏幕
- 保存到csv
- 使用列来
groupby
…由于操作是vector化的,效率更高。
编辑:事实上,OP的首选的答案可能是“ pandas
最新版本不写入时间csv,如果是00:00:00
的所有意见”。
转换为datetime64[D]
:
df.dates.values.astype('M8[D]')
虽然重新分配给DataFrame col会将其恢复为[ns]。
如果你想实际的datetime.date
:
dt = pd.DatetimeIndex(df.dates) dates = np.array([datetime.date(*date_tuple) for date_tuple in zip(dt.year, dt.month, dt.day)])