【问题标题】:pandas time series and pickling熊猫时间序列和酸洗
【发布时间】:2014-09-20 22:44:15
【问题描述】:

我在使用 pandas 时遇到了一个非常奇怪的问题。

我有一个熊猫时间序列,很好用。我用python标准工具腌制它,但是当我想把它解开时,pandas无法重建对象,借口索引错误。

pickling pandas 数据结构有问题吗?一种首选的方法?我打算这样做的方式有什么问题吗?

以下是详细信息:

我有一些时间序列,称为数据,经过一些处理后,想保留为泡菜文件,以加快重用速度。我的时间序列如下所示:

sample_time
2013-06-03 21:55:40    0.553846
2013-06-03 22:13:25    0.569231
...
2013-07-09 16:55:00    0.430769
2013-07-09 16:57:45    0.430769
2013-07-09 16:59:44    0.384615
Name: fill, Length: 11550

我像这样腌制 Series 对象:

pickle.dump(data,open("pickle_file","w"))

然后尝试稍后重新加载:

data_back=pickle.load(open("pickle_file",'r'))

然后我得到以下错误:

Traceback (most recent call last):
  File "/home/antoine/velib/code/project_tools.py", line 197, in <module>
    test()  
  File "/home/antoine/velib/code/project_tools.py", line 172, in test
    data_back=p_l(open("test_dump",'r'))
  File "/home/antoine/program/anaconda/lib/python2.7/pickle.py", line 1378, in load
    return Unpickler(file).load()
  File "/home/antoine/program/anaconda/lib/python2.7/pickle.py", line 858, in load
    dispatch[key](self)
  File "/home/antoine/program/anaconda/lib/python2.7/pickle.py", line 1217, in load_build
    setstate(state)
  File "/home/antoine/program/anaconda/lib/python2.7/site-packages/pandas/core/internals.py", line 2063, in __setstate__
    placement=self.axes[0].get_indexer(items))
  File "/home/antoine/program/anaconda/lib/python2.7/site-packages/pandas/core/index.py", line 1259, in get_indexer
    raise InvalidIndexError('Reindexing only valid with uniquely'
pandas.core.index.InvalidIndexError: Reindexing only valid with uniquely valued Index objects

Pandas 拒绝重建 Series,发现索引可能不是唯一的。 但是我的时间序列日期时间索引保证是唯一的。证明:如果我从我的数据索引构建一个系列,我发现没有重复:

我制作了一个只包含我的数据系列索引的新系列。

data_index=pd.DataFrame(data=data.index)
data_index["dup"]=data_index.duplicated()

data_index
              sample_time    dup
0     2013-06-03 21:55:40  False
1     2013-06-03 22:13:25  False
2     2013-06-03 22:19:21  False
...                   ...    ...
11547 2013-07-09 16:55:00  False
11548 2013-07-09 16:57:45  False
11549 2013-07-09 16:59:44  False

[11550 rows x 2 columns]

所以对我来说时间索引没有问题,它是独一无二的。 数据时间序列看起来是合法的,因为它是第一次存在的。但是在酸洗和解酸的过程中,pandas 拒绝将时间序列重新构建回来。

这可能是一个错误吗?

【问题讨论】:

  • 什么版本的熊猫?
  • 特别是如果你在跨版本,你应该使用内置的pickle支持:pandas.pydata.org/pandas-docs/dev/io.html#io-pickle
  • 有一个错误(已在 master 中修复),请参见此处:github.com/pydata/pandas/pull/7794;但仅在它们重复时才会显示
  • pandas.__version__ 给了我 0.14.0,然后我使用相同版本的 pandas 和 pickle 在同一段代码中腌制和取消腌制两行代码
  • 所以你遇到了那个错误。您可以更新到 master(0.15 也即将推出)。通常在索引中重复只会使事情更难处理。你可以这样做: s.loc[Series(s.index).duplicated()] 找到它们(只需反转索引以选择非重复项)

标签: python pandas


【解决方案1】:

他们是 0.14.0 中存在的错误,已在 master (0.15.0) 中修复,预计在 2014 年 10 月初发布,请参阅 here

基本上尝试使用仅具有单个 dtype 的非唯一索引(例如,仅由浮点数组成的 Series 或 DataFrame)来腌制 pandas 对象,由于重构代码中的某些假设,会在重构时失败。

解决方法是使用 master/0.15.0。 (我相信 0.14.1 也可以),或者让你的 pandas 对象有一个唯一的索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2014-10-08
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多