Pandas,使用dt.date或dt.strftime从datetime列中删除时间戳会将列转换为dtype:obje



如何存储数据的示例df:

df = pd.DataFrame({'DOB': {0: '2003-01-01 00:00:00+00', 1: '2003-01-02 00:00:00+00'}})

我想将该列转换为日期时间,并且只保留年月日的值。基本上,正是这个问题:

从pandas数据帧中的日期时间中删除时间戳

这个:

将Pandas DataFrame中的日期对象列转换为字符串

除了使用这些答案之外,从已经是Datetime格式的列中提取日期会将该列转换为Object格式。评论中也讨论了这一点,但似乎已经转移到了不再可用的聊天中。

第一个答案的结果:

[in] pd.to_datetime(df['DOB']).dt.date
[out]
0    2003-01-01
1    2003-01-02
Name: DOB, dtype: object

第二个答案的结果:

[in] pd.to_datetime(df['DOB']).dt.strftime('%Y-%m-%d')
[out] 
0    2003-01-01
1    2003-01-02
Name: DOB, dtype: object

正如您所看到的,它不再是Datetime格式,而是一个对象。那么我就不能在我的脚本中进一步使用它了。

使用pd.to_datetime的format = "%Y-%m-%d选项也不起作用,因为时间戳仍然存在:

[in] pd.to_datetime(df['DOB'], format = "%Y-%m-%d")
[out] 
0   2003-01-01 00:00:00+00:00
1   2003-01-02 00:00:00+00:00
Name: DOB, dtype: datetime64[ns, UTC]

有什么简单的解决方案可以确保列保持日期时间格式,同时只保持日期格式?

IMO这里没有问题:

s = pd.to_datetime(pd.Series(['2021-02-01 00:00:00']))
s
# 0   2021-02-01
# dtype: datetime64[ns]

事实上,显示的类型是";对象":

s.dt.date
# 0    2021-02-01
# dtype: object

但这并不意味着什么,类型实际上是datetime.date:

type(s.dt.date[0])
# datetime.date

我有两个额外的行,但希望有一个更简单的解决方案来解决这个问题:

df['DOB'] = pd.to_datetime(df['DOB'])
df['DOB'] = DF['DOB'].dt.date
df['DOB'] = pd.to_datetime(df['DOB'])
# gives
[in] df
[out]
0    2003-01-01
1    2003-01-02
Name: DOB, dtype: datetime64[ns]

最新更新