试图在 Panda DataFrame 中将感知本地日期时间转换为天真的本地日期时间
Posted
技术标签:
【中文标题】试图在 Panda DataFrame 中将感知本地日期时间转换为天真的本地日期时间【英文标题】:Trying to convert aware local datetime to naive local datetime in 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 时间,我想将其保留为当地时间
顺便说一句,相关:***.com/q/38531317/10197418
【参考方案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 了解如何删除时区感知。
【讨论】:
以上是关于试图在 Panda DataFrame 中将感知本地日期时间转换为天真的本地日期时间的主要内容,如果未能解决你的问题,请参考以下文章
利用python数据分析panda学习笔记之DataFrame