【问题标题】: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 添加了该偏移量,我还没有找到如何摆脱它。

标签: python pandas


【解决方案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)stackoverflow.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'
    

    【讨论】:

      猜你喜欢
      • 2022-07-07
      • 2023-01-09
      • 2016-09-01
      • 2019-12-07
      • 2019-03-05
      • 1970-01-01
      • 2017-06-16
      • 2016-12-23
      相关资源
      最近更新 更多