【问题标题】:Trying to convert aware local datetime to naive local datetime in Panda DataFrame试图在 Panda DataFrame 中将感知本地日期时间转换为天真的本地日期时间
【发布时间】:2020-11-09 13:20:09
【问题描述】:

我正在努力按照我的标题所说的那样做。我有一个带有日期时间和时区的熊猫数据框。

我正在尝试将列 startDate 转换为本地天真的日期时间,如下所示:

这是执行此操作的一段代码

df['startDate'] = df['startDate'].apply(lambda x: timezone('UTC').localize(x))
df["startDate"] = df.apply(lambda x: x.startDate.astimezone(timezone(x.timezone)), axis=1)
df["startDate"] = df["startDate"].dt.tz_localize(None)

我收到此错误消息。

Tz 感知 datetime.datetime 不能转换为 datetime64,除非 utc=真

如果我真的精确 UTC=True,我会得到我的初始日期时间值,这不是我想要实现的目标

我想从中得到

2020-07-20 20:30:00-07:00
2020-07-21 16:00:00-04:00
2020-07-20 20:30:00-07:00

到这里

2020-07-20 20:30:00
2020-07-21 16:00:00
2020-07-20 20:30:00

我正在考虑转换为字符串,并删除最后 5 个字符并重新转换为日期时间对象。不过我正在寻找更好的解决方案。

谢谢

【问题讨论】:

  • 1.放弃应用并使用df['startDate'].tz_localize('UTC') 2. 然后使用dt.normalize()strftime 方法将您的日期格式化为字符串。
  • 不起作用,它将我的日期时间重新转换为 UTC 时间,我想将其保留为当地时间
  • 顺便说一句,相关:stackoverflow.com/q/38531317/10197418

标签: pandas dataframe timezone


【解决方案1】:

如果您读取带有 UTC 偏移量的日期时间字符串,例如 "2020-07-20 20:30:00-07:00",这将为您提供 datetime.datetime 类型的系列(而不是 pandas datetime64[ns])。因此,如果我做对了,您要做的是删除tzinfo。这基本上描述为here,你可以这样做

import pandas as pd

df = pd.DataFrame({'startDate':pd.to_datetime(['2020-07-20 20:30:00-07:00',
                                               '2020-07-21 16:00:00-04:00',
                                               '2020-07-20 20:30:00-07:00'])})
# df['startDate'].iloc[0]
# datetime.datetime(2020, 7, 20, 20, 30, tzinfo=tzoffset(None, -25200))

df['startDate_naive'] = df['startDate'].apply(lambda t: t.replace(tzinfo=None))

# df['startDate_naive']
# 0   2020-07-20 20:30:00
# 1   2020-07-21 16:00:00
# 2   2020-07-20 20:30:00
# Name: startDate_naive, dtype: datetime64[ns]

如果您使用时区感知 pandas 日期时间列,请参阅 my answer here 了解如何删除时区感知。

【讨论】:

    猜你喜欢
    • 2011-07-24
    • 2018-08-30
    • 2012-10-07
    • 1970-01-01
    • 2018-08-21
    • 2019-06-21
    • 1970-01-01
    • 2021-05-02
    • 2018-07-15
    相关资源
    最近更新 更多