我遇到了一个问题,当我为唯一索引值过滤数据帧时,我的时区信息被剥离了(这是使用groupby()和first()完成的)。 e.g。
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()似乎保留了时区信息),但这对我目前的工作有两个问题:
我可以通过在数据框中创建一个新列来保存索引值来使用drop_duplicates。 e.g。
df['dates'] = df.index
df = df.drop_duplicates(cols=['dates'])
df.pop('dates')
虽然这有效,但看起来很草率。这里有没有我没看到的替代方案?
答案 0 :(得分:0)
使用pandas 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。如果您想使用最新版本的pandas,请升级到NumPy> = 1.7.0(GH7711)
由于您正在升级,现在可能是查看已安装的pandas版本dependencies并升级可能会变得有点陈旧的版本的好时机。
祝你好运!