2014-12-03 94 views
1

我遇到了一个问题,当我过滤一个数据帧的唯一索引值(这是通过使用groupby()和first())来完成时,我的时区信息被剥离掉了。例如pandas groupby strip timezone in index

import pandas as pd 
import pytz 

utc = pytz.utc 

index = pd.date_range('20140101','20140102',freq='6H',tz=utc) 
data = pd.np.random.randint(0,10,(5,3)) 
namen = list('abc') 

df = pd.DataFrame(data=data,index=index,columns=namen) 

时区信息现在存储在索引:

>>>df.index[0] 

    Timestamp('2014-01-01 00:00:00+0000', tz='UTC') 

当我把唯一的值我失去了时间戳信息。

df = df.groupby(df.index).first() 

>>> df.index[0] 
    Timestamp('2014-01-01 00:00:00', tz=None) 

当然,我可以使用.drop_duplicates()做同样的事情(.drop_duplicates()似乎保留时区信息),但是这对我目前的工作两个问题:

  1. drop_duplicates对索引不起作用,这很重要(请参阅#2)
  2. 由于我的数据集的特性,我很可能在数据框中有相同的行,因此使用drop_duplicates将删除这些其他行的好行。

我可以使用drop_duplicates通过在数据框中创建一个新列来保存索引值。例如

df['dates'] = df.index 
df = df.drop_duplicates(cols=['dates']) 
df.pop('dates') 

虽然这个工程,它似乎马虎。这里有没有其他的选择,我没有看到?

+0

我没看到这个。你使用的是什么版本的熊猫,pytz和numpy? – MattDMo 2014-12-03 19:22:52

+0

熊猫0.12.0,pytz 2013b – tnknepp 2014-12-03 19:24:38

回答

0

使用熊猫0.15.1,我没有看到你做同样的事情:

In [90]: so_df 
Out[90]: 
          a b c 
2014-01-01 00:00:00+00:00 3 6 2 
2014-01-01 06:00:00+00:00 9 3 5 
2014-01-01 12:00:00+00:00 2 9 4 
2014-01-01 18:00:00+00:00 3 6 3 
2014-01-02 00:00:00+00:00 4 1 4 

In [93]: so_df.index[3] 
Out[93]: Timestamp('2014-01-01 18:00:00+0000', tz='UTC', offset='6H') 

In [94]: so_df2 = so_df.groupby(so_df.index).first() 

In [95]: so_df2 
Out[95]: 
          a b c 
2014-01-01 00:00:00+00:00 3 6 2 
2014-01-01 06:00:00+00:00 9 3 5 
2014-01-01 12:00:00+00:00 2 9 4 
2014-01-01 18:00:00+00:00 3 6 3 
2014-01-02 00:00:00+00:00 4 1 4 

In [96]: so_df2.index[3] 
Out[96]: Timestamp('2014-01-01 18:00:00+0000', tz='UTC', offset='6H') 

版本0.15.0改善several things与时区,包括

  • 一个时间序列/当插入到Series/DataFrame时本地化为UTC的索引将保留UTC时区(而不是天真datetime64[ns])作为object dtype(GH8411

希望升级能够解决您的问题。请注意,自0.15.0起,

pandas> = 0.15.0将不再支持与NumPy版本< 1.7.0的兼容性。如果你想用大熊猫的最新版本,请升级到与NumPy> = 1.7.0(GH7711

既然你升级,现在可能是一个好时机,看看已安装的版本熊猫'dependencies并升级任何可能会有点陈旧的。

祝你好运!

+0

已更新至15,我现在看到与您相同的结果。这让我想知道,我现在在时间戳中看到的这个“偏移”是什么?我在快速网络搜索中找不到一个好的解释。我知道它代表了我的时间序列的频率,但有什么用? – tnknepp 2014-12-03 20:08:47

+0

@tnknepp我不确定它扮演的角色,除了存储关于时间序列本身的数据。 – MattDMo 2014-12-03 21:14:44