在熊猫中剥离时区信息

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'

【讨论】:

以上是关于在熊猫中剥离时区信息的主要内容,如果未能解决你的问题,请参考以下文章

剥离熊猫列中特定字符左侧的字符

日期时间和熊猫之间的 Unix 纪元值不匹配

java 使用Zulu时区创建一个剥离原始时区的日期

在熊猫数据框中添加时区

如何在熊猫中使用 read_csv 将时区感知日期时间作为时区天真的本地 DatetimeIndex 读取?

2016-03-22-信息系统实践手记3-按业务展开的代码剥离