我有UTC时间戳的数据。我想将这个时间戳的时区转换为“US/Pacific”,并将其作为分层索引添加到pandas数据帧中。我已经能够将时间戳转换为索引,但是当我尝试将其作为列或索引添加回数据帧时,它会丢失时区格式。
>>> 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时区,而不是转换后的太平洋时区。
如何更改时区并将其作为索引添加到数据帧?
如果将其设置为索引,则会自动将其转换为索引:
然后执行
tz_localize
:然后您可以将label列附加到索引:这绝对是个虫子!
一个棘手的解决方法是直接转换(datetime)级别(当它已经是多索引时):
到现在为止,这个问题已经解决了。例如,现在可以调用:
不过,对于给定的示例,您必须调用它两次。(即每层一次。)
另一个在pandas 0.13.1中工作并解决FrozenList无法分配的问题:
在这个问题上苦苦挣扎,多重指数在许多其他条件下也失去了tz。
相关问题 更多 >
编程相关推荐