首页 > 解决方案 > 关于仅在使用 pd.to_datetime 后保留日期信息

问题描述

原始记录有如下格式,即日期信息以字符串格式存储

records[‘start_date’].unique()
array([nan, '6/3/2012', '10/20/2013'], dtype=object)

正如这个论坛所建议的,我使用以下代码将其转移到 datetime

Records[‘start_date’] = pd.to_datatime(records[‘start_date’], format =’%m/%d/%Y’)

转移的数组有以下总结

array(['NaT', '2012-06-03T00:00:00.000000000',
       '2013-10-20T00:00:00.000000000',], dtype='datetime64[ns]')

我想让传输的日期时间格式更精简,只保留日期而不保留那些分钟/秒信息。具体来说,我想要这样的格式

array(['NaT', '2012-06-03,
       '2013-10-20',], dtype='datetime64[ns]')

如何实现这一目标?谢谢

标签: pythonpython-3.xpandasnumpydatetime

解决方案


我想让传输的日期时间格式更精简,只保留日期而不保留那些分钟/秒信息。

这是不准确的。np.datetime64本质上是int64. 因此,这种格式将比字符串更有效地存储日期(包括时间等)。不要被显示所迷惑:'2012-06-03T00:00:00.000000000'它只是一个底层整数的文本表示。这里有一些证据:

import datetime, sys, numpy as np

now = datetime.datetime.now()

x_date = sys.getsizeof(np.datetime64(now))             # 40
x_int = sys.getsizeof(np.datetime64(now).astype(int))  # 28 
y = sys.getsizeof('10/20/2013')                        # 59

现在,如果您主要关心display,那么您可以在 Pandas 中将您的系列转换为objectdtype 系列中保存的字符串:

records['start_date'] = records['start_date'].dt.strftime('%Y-%m-%d')

另一种方法是使用一系列datetime.date对象:

records['start_date'] = records['start_date'].dt.date

请注意,进一步的操作将导致内存和性能效率低下,第一个选项更是如此。


推荐阅读