如何计算ts1 - ts2.interpolate(index = ts1.index)

时间:2014-03-19 15:17:27

标签: python pandas

示例数据:

import pandas as pd
from datetime import timedelta, datetime
from random import randint

base_index = [datetime(2012, 12, 31, 23, 55 + x) for x in range(5)]
index1 = [x + timedelta(seconds=randint(0, 10)) for x in base_index]
index2 = [x + timedelta(seconds=randint(0, 10)) for x in base_index]

ts1 = pd.Series(range(5), index=index1)
ts2 = pd.Series(range(5), index=index2)

这导致这些时间序列:

2012-12-31 23:55:03    0
2012-12-31 23:56:07    1
2012-12-31 23:57:01    2
2012-12-31 23:58:01    3
2012-12-31 23:59:03    4

2012-12-31 23:55:03    0
2012-12-31 23:56:09    1
2012-12-31 23:57:09    2
2012-12-31 23:58:04    3
2012-12-31 23:59:01    4

现在我希望在ts1的索引处对ts2进行采样,并从ts1中减去这些值。结果应该是浮点数非常接近零的时间序列。我最接近的是:

df = pd.DataFrame({"ts1": ts1, "ts2": ts2})
df["ts3"] = df["ts2"].interpolate(method="time")
df["ts4"] = df["ts1"] - df["ts3"]
result = df["ts4"].dropna()

它给出了我想要的结果:

2012-12-31 23:55:03    0.000000
2012-12-31 23:56:07    0.030303
2012-12-31 23:57:01    0.133333
2012-12-31 23:58:01    0.054545
2012-12-31 23:59:03    0.000000

但它不是很漂亮。还有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

我认为你的解决方案是合理的。将两个时间序列放在框架中会自动对齐它们。

这是另一种方式

对齐系列(基本上结合他们的索引)

In [30]: ats1,ats2 = ts1.align(ts2)

对齐系列的插值输出

In [32]: ats2.interpolate(method='time')
Out[32]: 
2012-12-31 23:55:00    0.000000
2012-12-31 23:56:09    0.985714
2012-12-31 23:56:10    1.000000
2012-12-31 23:57:00    1.980392
2012-12-31 23:57:01    2.000000
2012-12-31 23:58:00    3.000000
2012-12-31 23:58:07    3.100000
2012-12-31 23:59:04    3.914286
2012-12-31 23:59:10    4.000000
dtype: float64

仅显示原始ts1中的值

In [33]: ats2.interpolate(method='time').reindex_like(ts1)
Out[33]: 
2012-12-31 23:55:00    0.000000
2012-12-31 23:56:09    0.985714
2012-12-31 23:57:00    1.980392
2012-12-31 23:58:07    3.100000
2012-12-31 23:59:04    3.914286
dtype: float64

In [34]: ts1
Out[34]: 
2012-12-31 23:55:00    0
2012-12-31 23:56:09    1
2012-12-31 23:57:00    2
2012-12-31 23:58:07    3
2012-12-31 23:59:04    4
dtype: int64

In [35]: 

插值并消除原始值并显示差异

In [31]: ts1-ats2.interpolate(method='time').reindex_like(ts1)
Out[31]: 
2012-12-31 23:55:00    0.000000
2012-12-31 23:56:09    0.014286
2012-12-31 23:57:00    0.019608
2012-12-31 23:58:07   -0.100000
2012-12-31 23:59:04    0.085714
dtype: float64