在熊猫中剥离时区信息
Posted
技术标签:
【中文标题】在熊猫中剥离时区信息【英文标题】:Strip timezone info in pandas 【发布时间】:2016-04-03 01:06:19 【问题描述】:我一直在努力从熊猫数据框中的列中删除时区信息。我检查了以下问题,但它对我不起作用:
Can I export pandas DataFrame to Excel stripping tzinfo?
我使用 tz_localize 将时区分配给 datetime 对象,因为我需要使用 tz_convert 转换到另一个时区。这会以“-06:00”的方式添加 UTC 偏移量。我需要摆脱这个偏移量,因为当我尝试将数据框导出到 Excel 时会导致错误。
实际输出
2015-12-01 00:00:00-06:00
期望的输出
2015-12-01 00:00:00
我尝试使用 str() 方法获取我想要的字符,但似乎 tz_localize 的结果不是字符串。到目前为止,我的解决方案是将数据框导出到 csv,读取文件,并使用 str() 方法获取我想要的字符。
有没有更简单的解决方案?
【问题讨论】:
df['datetime'].dt.tz_localize(None)
不起作用吗?用你的列名替换datetime
谢谢。它不起作用。日期格式为“2015-12-01 00:00:00-06:00”。我使用“to_datetime”将原始日期格式转换为日期时间对象,以便应用“tz_localize”转换为另一个时区。似乎 tz_localize 添加了该偏移量,我还没有找到如何摆脱它。
密切相关(如果不是欺骗)Convert pandas timezone-aware DateTimeIndex to naive timestamp, but in certain timezone
【参考方案1】:
如果您的系列仅包含日期时间,那么您可以这样做:
my_series.dt.tz_localize(None)
这将删除时区信息(它不会更改时间)并返回一系列幼稚的本地时间,例如可以使用 to_excel() 将其导出到excel。
【讨论】:
如果 pandas 数据框包含日期时间以外的列怎么办?我收到诸如“TypeError:索引不是有效的 DatetimeIndex 或 PeriodIndex”之类的错误 @DaveX 然后你会做my_df[time_columns] = my_df[time_columns].dt.tz_localize(None)
其中time_columns
是具有日期时间dtype的列名列表【参考方案2】:
也许可以帮助去除最后 6 个字符:
print df
datetime
0 2015-12-01 00:00:00-06:00
1 2015-12-01 00:00:00-06:00
2 2015-12-01 00:00:00-06:00
df['datetime'] = df['datetime'].astype(str).str[:-6]
print df
datetime
0 2015-12-01 00:00:00
1 2015-12-01 00:00:00
2 2015-12-01 00:00:00
【讨论】:
谢谢!那成功了。我必须先将其转换为字符串。 您可以在此答案中使用replace(tzinfo=None)
:***.com/questions/10944047/remove-pytz-timezone/…
@Beatriz Fronseca 谢谢你的建议。
我猜这行得通,但根据我的经验,最好转换为日期时间类,然后使用pd.Series.dt.tz_localize
将时区设置为None
,正如@Diego Mora Cespedes 在他的在这个帖子上回答。最好不要依赖日期格式,这样可能会快很多。
@quantif - 绝对同意 ;)【参考方案3】:
要从具有混合列的 DataFrame 中的所有日期时间列中删除时区,只需使用:
for col in df.select_dtypes(['datetimetz']).columns:
df[col] = df[col].dt.tz_localize(None) # 00:00:00-06:00 -> 00:00:00
#df[col] = df[col].dt.tz_convert(None) # 00:00:00-06:00 -> 06:00:00
【讨论】:
错误答案:tz_convert(None)
将在删除时区指示器之前转换为 UTC,因此 pd.Timestamp('2015-12-01 00:00:00-06:00').tz_convert(None)
将导致 Timestamp('2015-12-01 06:00:00')
。【参考方案4】:
按照 Beatriz Fonseca 的建议,我最终做了以下事情:
from datetime import datetime
df['dates'].apply(lambda x:datetime.replace(x,tzinfo=None))
【讨论】:
【参考方案5】:如果总是要忽略最后 6 个字符,则可以简单地对当前字符串进行切片:
>>> '2015-12-01 00:00:00-06:00'[0:-6]
'2015-12-01 00:00:00'
【讨论】:
以上是关于在熊猫中剥离时区信息的主要内容,如果未能解决你的问题,请参考以下文章