猿问

更改熊猫中日期-时间列的时区并添加为层次结构索引

我有带有UTC时间戳记的数据。我想将此时间戳的时区转换为“ US / Pacific”,并将其作为层次结构索引添加到pandas DataFrame。我已经能够将时间戳转换为索引,但是当我尝试将其作为列或索引添加回DataFrame时,它将丢失时区格式。


>>> import pandas as pd

>>> dat = pd.DataFrame({'label':['a', 'a', 'a', 'b', 'b', 'b'], 'datetime':['2011-07-19 07:00:00', '2011-07-19 08:00:00', '2011-07-19 09:00:00', '2011-07-19 07:00:00', '2011-07-19 08:00:00', '2011-07-19 09:00:00'], 'value':range(6)})

>>> dat.dtypes

#datetime    object

#label       object

#value        int64

#dtype: object

现在,如果我尝试直接转换系列,则会遇到错误。


>>> times = pd.to_datetime(dat['datetime'])

>>> times.tz_localize('UTC')

#Traceback (most recent call last):

#  File "<stdin>", line 1, in <module>

#  File "/Users/erikshilts/workspace/schedule-detection/python/pysched/env/lib/python2.7/site-packages/pandas/core/series.py", line 3170, in tz_localize

#    raise Exception('Cannot tz-localize non-time series')

#Exception: Cannot tz-localize non-time series

如果将其转换为索引,则可以将其作为时间序列进行操作。注意,索引现在具有太平洋时区。


>>> times_index = pd.Index(times)

>>> times_index_pacific = times_index.tz_localize('UTC').tz_convert('US/Pacific')

>>> times_index_pacific

#<class 'pandas.tseries.index.DatetimeIndex'>

#[2011-07-19 00:00:00, ..., 2011-07-19 02:00:00]

#Length: 6, Freq: None, Timezone: US/Pacific

但是,现在我遇到了将索引添加回数据框的问题,因为它失去了时区格式:


>>> dat_index = dat.set_index([dat['label'], times_index_pacific])

>>> dat_index

#                                      datetime label  value

#label                                                      

#a     2011-07-19 07:00:00  2011-07-19 07:00:00     a      0

#      2011-07-19 08:00:00  2011-07-19 08:00:00     a      1

#      2011-07-19 09:00:00  2011-07-19 09:00:00     a      2

#b     2011-07-19 07:00:00  2011-07-19 07:00:00     b      3

#      2011-07-19 08:00:00  2011-07-19 08:00:00     b      4

#      2011-07-19 09:00:00  2011-07-19 09:00:00     b      5

您会注意到索引返回到UTC时区,而不是转换后的太平洋时区。


如何更改时区并将其作为索引添加到DataFrame?


明月笑刀无情
浏览 173回答 3
3回答
随时随地看视频慕课网APP

相关分类

Python
我要回答