首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >更改pandas中date-time列的时区,并添加为分层索引

更改pandas中date-time列的时区,并添加为分层索引
EN

Stack Overflow用户
提问于 2013-06-18 09:11:03
回答 3查看 54.3K关注 0票数 40

我有UTC时间戳的数据。我想将这个时间戳的时区转换为‘美国/太平洋’,并将其作为层次索引添加到pandas DataFrame中。我可以将时间戳转换为索引,但当我尝试将其作为列或索引添加回DataFrame时,它会丢失时区格式。

代码语言:javascript
复制
>>> 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

现在,如果我尝试直接转换级数,我会遇到错误。

代码语言:javascript
复制
>>> 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

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

代码语言:javascript
复制
>>> 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

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

代码语言:javascript
复制
>>> 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?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-29 20:18:11

到目前为止,这个问题已经解决了。例如,您现在可以调用:

代码语言:javascript
复制
dataframe.tz_localize('UTC', level=0)

不过,对于给定的示例,您必须调用它两次。(即,每个级别一次。)

票数 22
EN

Stack Overflow用户

发布于 2014-07-15 04:08:13

另一种解决方法适用于pandas 0.13.1,并解决了FrozenList无法分配的问题:

代码语言:javascript
复制
index.levels = pandas.core.base.FrozenList([
    index.levels[0].tz_localize('UTC').tz_convert(tz),
    index.levels[1].tz_localize('UTC').tz_convert(tz)
])

在这个问题上挣扎了很多,MultiIndex在许多其他情况下也失去了tz。

票数 2
EN

Stack Overflow用户

发布于 2014-05-30 08:11:46

解决方法似乎不起作用,因为分层索引的索引级别似乎是不可变的(FrozenList是不可变的)。

从单一索引开始并追加也不起作用。

创建一个转换为时间戳并转换由to_datetime()返回的序列的每个成员的lambda函数也不起作用。

有没有一种方法可以创建时区感知系列,然后将它们插入到数据帧中/将它们作为索引?

代码语言:javascript
复制
joined_event_df = joined_event_df.set_index(['pandasTime'])
joined_event_df.index = joined_event_df.index.get_level_values(1).tz_localize('UTC').tz_convert('US/Central')
# we have tz-awareness above this line
joined_event_df = joined_event_df.set_index('sequence', append = True)
# we lose tz-awareness in the index as soon as we add another index
joined_event_df = joined_event_df.swaplevel(0,1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17159207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档