如何在Python中从日期时间中删除时间?
如何在Python中从日期时间中删除时间?
我使用pandas.to_datetime
来解析我的数据中的日期。尽管日期都是每天的,但Pandas默认使用datetime64[ns]
来表示日期。\n我想知道是否有一种优雅/聪明的方法可以将日期转换为datetime.date
或datetime64[D]
,这样在将数据写入CSV时,日期不会附加00:00:00
。我知道我可以逐个元素地手动转换类型:\n[dt.to_datetime().date() for dt in df.dates]
\n但是这样做非常慢,因为我有很多行,而且这有点违背了使用pandas.to_datetime
的目的。有没有一种一次性转换整列的dtype
的方法?或者,pandas.to_datetime
是否支持精度规范,以便在处理每日数据时可以去掉时间部分?
问题的出现原因是,虽然stackoverflow上有一个回答了问题,但它没有解决性能问题,因为它仍然依赖于Python的datetime对象,所以对它们的任何操作都不会向量化,即速度较慢。所以需要一个更高效的替代方法。
解决方法是使用pandas库中的dt.floor('d')方法,它可以将时间部分设置为00:00:00,从而达到只保留日期部分的效果。这种方法在以下情况下能够满足要求:
- 打印到屏幕上
- 保存为csv文件
- 在groupby操作中使用该列
这种方法更高效,因为它是向量化的操作。
编辑:事实上,OP更喜欢的答案可能是“如果所有的观测值的时间都是00:00:00,最新版本的pandas不会将其写入csv文件”。不幸的是,to_json仍然会写入完整的00:00:00。
这种方法比dt.normalize()在长度超过几百个元素的序列上更快。在一个超过100万行的数据框中,这种方法比我找到的其他选项都要快得多,只有normalize稍微慢一些。此外,保持日期部分是pandas本地的,这意味着它可以保存到HDF存储中(从pandas 1.1.4开始,datetime.date列无法保存到HDF存储中)。
问题的原因是:需要从Python的datetime对象中删除时间部分。
解决方法是:使用dt.date
方法从datetime对象中提取日期部分,并将其赋值给一个新的列date_only
。但需要注意的是,此操作会将列的类型更改为对象类型,因此需要使用astype('datetime64')
将其转换回datetime类型以保持一致性。
以下是完整的代码解决方案:
df['date_only'] = df['date_time_column'].dt.date df['date_only'] = df['date_only'].astype('datetime64')
这样就可以从Python的datetime对象中删除时间部分并保持一致性了。