【问题标题】:Pandas, removing timestamp from datetime column using dt.date or dt.strftime converts column to dtype: objectPandas,使用 dt.date 或 dt.strftime 从 datetime 列中删除时间戳将列转换为 dtype:object
【发布时间】:2022-02-16 19:49:10
【问题描述】:

我的数据如何存储的示例 df:

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

我想将该列转换为日期时间,并且只保留年-月-日值。基本上,就像这个问题一样:

Removing the timestamp from a datetime in pandas dataframe

还有这个:

Convert column of date objects in Pandas DataFrame to strings

除了使用这些答案,从已经是日期时间格式的列中提取日期会将列转换为对象格式。这也在 cmets 中进行了讨论,但似乎已转移到不再可用的聊天中。

第一个答案的结果:

[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

如您所见,它不再是日期时间格式,而是一个对象。然后我不能在我的脚本中进一步使用它。

使用 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]

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

【问题讨论】:

  • 你想要什么类型的?对象并不意味着任何特定的东西
  • 我希望该列采用日期时间格式。就像显示代码的底部一样,但没有时间戳。
  • pd.to_datetime(df['DOB']).dt.date有什么问题呢?这会给你一个datetime.date
  • 它没有给出日期时间,它返回为 dtype: object 。这是第一个答案的问题。
  • 这只是一个表示,真正的类型是datetime.date:见here。实际上,您与许多其他类型有相同的东西

标签: python pandas dataframe datetime


【解决方案1】:

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

【讨论】:

  • 我在此列上使用 datetime 执行简单功能时经常遇到问题,但在使用 datetime 格式时却没有。
【解决方案2】:

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

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]

【讨论】:

  • 你可以直接到今天.dt.floor('d')
  • 这仍然以秒为单位添加时间戳。
  • 你的代码最后也有它们,只是没有显示
  • 你的代码实际上做的不同的是剥离 tzinfo (UTC)。您也可以通过本地化为 None 更方便地做到这一点; pd.to_datetime(df['DOB']).dt.floor('d').dt.tz_localize(None) 一行。
猜你喜欢
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 2023-01-25
  • 2022-11-30
  • 2016-10-05
  • 2015-01-02
相关资源
最近更新 更多