我遇到了一个问题,当我过滤数据帧以获取唯一索引值时,我的时区信息被剥离(这是使用 groupby() 和 first() 完成的)。 例如
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不对索引进行操作,这很重要(参见#2)
- 由于我的数据集的性质,我很可能在数据帧中有相同的行,因此使用 drop_duplicates 将删除这些原本好的行。
我可以通过在数据帧内创建一个新列来保存索引值来使用drop_duplicates。 例如
df['dates'] = df.index
df = df.drop_duplicates(cols=['dates'])
df.pop('dates')
虽然这有效,但似乎很草率。 这里有我没有看到的替代方案吗?
使用 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 改进了与时区相关的一些内容,包括
- 当插入到序列/数据帧中时,本地化为 UTC 的时间序列/索引将保留 UTC 时区(而不是天真的
datetime64[ns]
)作为object
dtype (GH8411)
希望升级可以解决您的问题。请注意,从 0.15.0 开始,
pandas>= 0.15.0 将不再支持与 NumPy 版本<1.7.0 的兼容性。如果您想使用最新版本的熊猫,请升级到 NumPy>= 1.7.0 (GH7711)
由于您正在升级,现在可能是查看已安装的 pandas 依赖项版本并升级任何可能有点过时的版本的好时机。
祝你好运!