在熊猫中删除时区信息

Ern*_*561 19 python pandas

我一直在努力从pandas数据框中的列中删除时区信息.我检查了以下问题,但它对我不起作用:

我可以将pandas DataFrame导出到Excel剥离tzinfo吗?

我使用tz_localize为datetime对象分配时区,因为我需要使用tz_convert转换为另一个时区.这会以"-06:00"的方式添加UTC偏移量.我需要摆脱这种偏移,因为当我尝试将数据框导出到Excel时会导致错误.

实际输出

2015-12-01 00:00:00-06:00
Run Code Online (Sandbox Code Playgroud)

期望的输出

2015-12-01 00:00:00
Run Code Online (Sandbox Code Playgroud)

我试图使用str()方法获取我想要的字符,但似乎tz_localize的结果不是字符串.到目前为止,我的解决方案是将数据帧导出到csv,读取文件,并使用str()方法获取我想要的字符.

有更简单的解决方案吗?

Die*_*des 23

如果你的系列只包含日期时间,那么你可以这样做:

my_series.dt.tz_localize(None)

这将删除时区信息(它不会改变时间)并返回一系列天真的本地时间,例如可以使用to_excel()导出到excel.

  • 如果pandas数据帧包含除日期时间之外的列,该怎么办?我收到类似"TypeError:index不是有效的DatetimeIndex或PeriodIndex"的错误 (3认同)
  • @DaveX 然后你会做`my_df[time_columns] = my_df[time_columns].dt.tz_localize(None)`,其中`time_columns` 是具有日期时间数据类型的列名列表 (2认同)

jez*_*ael 11

也许帮助剥离最后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
Run Code Online (Sandbox Code Playgroud)

  • 您可以像在这个答案中一样使用`replace(tzinfo = None)`:http://stackoverflow.com/questions/10944047/remove-pytz-timezone/#answer-10944136 (9认同)
  • 我想这工作正常,但根据我的经验,最好转换为日期时间类,然后使用“pd.Series.dt.tz_localize”将时区设置为“None”,正如 @Diego Mora Cespedes 在他的回答中建议的那样这个帖子。最好不要依赖日期格式,它可能会快得多。 (4认同)

Mik*_*ail 8

要从所有列中删除时区,只需使用:

for col in df.select_dtypes(['datetimetz']).columns:
    df[col] = df[col].dt.tz_convert(None)
Run Code Online (Sandbox Code Playgroud)

  • 错误答案:`tz_convert(None)` 将在删除时区指示器之前转换为 UTC,因此 `pd.Timestamp('2015-12-01 00:00:00-06:00').tz_convert(None)`将导致“时间戳('2015-12-01 06:00:00')”。 (2认同)