【问题标题】:Interpolate one time series onto custom time series将一个时间序列插入到自定义时间序列中
【发布时间】:2017-03-28 08:47:50
【问题描述】:

目标:将一个时间序列插入另一个自定义时间序列。

我检查了堆栈溢出,发现以下solution。但是,我收到以下错误:

 ValueError: cannot reindex from a duplicate axis

问题:我需要使用 datetimeindex 还是 Unix 时间戳也可以使用?因为前者需要我转换为 datetimeindex,然后进行插值,再转换回 unixtimestamp。这些是多个步骤,我想避免。

这是我所拥有的:

我想插值的时间序列:

In [111]: p.head()
Out[111]:
       Timestamp  Pressure  Quality
0  1477294046400    101155        3
1  1477294046901    101152        3
2  1477294047421    101150        3
3  1477294047922    101151        3
4  1477294048425    101151        3

还有自定义时间序列:

In [112]: a.head()
Out[112]:
            Time
0  1477294032458
1  1477294032463
2  1477294032468
3  1477294032473
4  1477294032478

按照上面链接中的解决方案,我做了以下事情:

pressure = pd.concat([p, a]).sort_index().interpolate().reindex(a.index)

但我收到如上所示的错误。

【问题讨论】:

  • 尝试将TimestampTime分别设置为索引轴并进行插值,看看是否有效。
  • 从字面上看,错误信息告诉你pd.concat([p, a]).sort_index().interpolate() has duplicates in the index。问题是您真正希望索引是什么以及您要做什么? @NickilMaveli 的建议似乎是您的本意?可能您需要退后一步,考虑 concat/merge 步骤,并确保这是您想要的。
  • a 中的所有时间都在 p 中的时间之前。这不是插值,而是反向外推。

标签: python pandas


【解决方案1】:

您没有提供足够的信息,所以我创建了自己的信息。您必须注意并调整它以满足您的需求。

这个答案是为this question 给出的。

设置

p = pd.DataFrame(
    dict(
        Pressure=[101155, 101152, 101150, 101151, 101151],
        Quality=[3, 3, 3, 3, 3]
    ),
    pd.Index([0, 10, 20, 30, 40], name='Timestamp')
)

a = [5, 12, 18, 24, 33, 35, 37]

一般策略

  • 确保时间戳在p的索引中
  • p.index(你的时间戳)和新的时间列表a的联合
  • 与联合重新索引。 NaN 将显示“新”索引值。
  • 当你插值时,使用method='index'DOCUMENTATION

代码

idx = p.index.union(a)
p.reindex(idx).interpolate('index')

p

idx = p.index.union(a)
p.reindex(idx).interpolate('index')

【讨论】:

  • 第二个命令导致以下错误:TypeError: Cannot cast array data from dtype('O') to dtype('float64') 根据规则'safe'。有什么想法吗?
  • 请注意,在我的示例中,a 是数据框而不是列表。所以,为了符合你的建议,我做了 a.set_index('Timestamp', inplace=True)。这给了我一个索引数据框。所有变量的dtype都是int64。
  • p.set_index('Timestamp', inplace=True)idx = p.index.union(a.Time)
  • 谢谢。上面的代码有效。最后一件事。给定“a”,我想包含 a 的值而不包含 p 的值。例如,最终结果应该只有 [5, 12, 18, 24, 33, 35, 37] 处的压力值,而不是 [0, 10, 20, 30, 40] 处的压力值,它们最初在 p 中。有任何想法吗?谢谢!
  • p.reindex(idx).interpolate('index').reindex(a.Time)
猜你喜欢
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 2022-11-22
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
相关资源
最近更新 更多