使用pandas.to_datetime时只保留date部分

我使用pandas.to_datetime来parsing数据中的date。 即使date全部是每日,大pandas默认代表datetime64[ns]的date。 我想知道是否有一个优雅的/巧妙的方式将date转换为datetime.datedatetime64[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 

pandasDatetimeIndexSeries有一个名为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)])