微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

合并两个熊猫中的时间序列并提取阈值时差内的观察值

我在熊猫中有两个时间序列,它们在看似随机的时间都有观测.下面的代码将创建一些示例时间序列:

import numpy as np
import pandas as pd

s1 = pd.Series(data=np.arange(5), index=['2014-05-06 09:15:34', '2014-05-06 09:34:00',
                                         '2014-05-06 11:20:43', '2014-05-07 12:13:00',
                                         '2014-05-07 17:29:19'])
s1.index = pd.DatetimeIndex(s1.index)

s2 = pd.Series(data=np.arange(6)*10, index=['2014-05-03 10:20:09', '2014-05-06 09:13:26',
                                            '2014-05-06 09:23:38', '2014-05-06 11:09:52',
                                            '2014-05-07 12:14:08', '2014-05-07 17:35:19'])
s2.index = pd.DatetimeIndex(s2.index)

给出s1:

2014-05-06 09:15:34    0
2014-05-06 09:34:00    1
2014-05-06 11:20:43    2
2014-05-07 12:13:00    3
2014-05-07 17:29:19    4
dtype: int64

和s2:

2014-05-03 10:20:09     0
2014-05-06 09:13:26    10
2014-05-06 09:23:38    20
2014-05-06 11:09:52    30
2014-05-07 12:14:08    40
2014-05-07 17:35:19    50
dtype: int64

我想合并这些时间序列,并提取彼此之间在10分钟内每个时间序列中都有观测值的行.因此,使用上面的数据:

> s2的第一个元素与s1中的任何元素都不匹配.
> s2的第二个元素距离s1的第一个元素大约2分钟以内,因此它们将匹配.
>等等…

理想情况下,我最终得到一个带有s1_time,s1_value,s2_time,s2_value列的DataFrame,但是我对输出的确切格式并不感到困惑.

我已经尝试过使用pd.merge,尝试使用asof等方法来处理各种不同的方法,但是最终我完全使自己感到困惑.我敢肯定,这是一个以前已解决的问题,但我似乎在网上找不到与随机间隔时间序列有关的很多信息(很多情况取决于每小时还是每天).

在熊猫中做到这一点的最佳方法是什么?

解决方法:

您可以先将reindex与method =’nearest’一起使用,然后如果s2中的值是唯一的,则使用以下值merge

print (s2.reindex(s1.index, method='nearest'))
2014-05-06 09:15:34    10
2014-05-06 09:34:00    20
2014-05-06 11:20:43    30
2014-05-07 12:13:00    40
2014-05-07 17:29:19    50
dtype: int32

print (pd.DataFrame({'s1':s1, 's2':s2.reindex(s1.index, method='nearest'), 'index_s1': s1.index}))
                               index_s1  s1  s2
2014-05-06 09:15:34 2014-05-06 09:15:34   0  10
2014-05-06 09:34:00 2014-05-06 09:34:00   1  20
2014-05-06 11:20:43 2014-05-06 11:20:43   2  30
2014-05-07 12:13:00 2014-05-07 12:13:00   3  40
2014-05-07 17:29:19 2014-05-07 17:29:19   4  50

print (pd.merge(s2.reset_index().rename(columns={0:'s2'}),
                pd.DataFrame({'s1':s1, 's2':s2.reindex(s1.index, method='nearest'), 'index_s1': s1.index}),
                on='s2').rename(columns={'index':'index_s2'}))

             index_s2  s2            index_s1  s1
0 2014-05-06 09:13:26  10 2014-05-06 09:15:34   0
1 2014-05-06 09:23:38  20 2014-05-06 09:34:00   1
2 2014-05-06 11:09:52  30 2014-05-06 11:20:43   2
3 2014-05-07 12:14:08  40 2014-05-07 12:13:00   3
4 2014-05-07 17:35:19  50 2014-05-07 17:29:19   4                

编辑:

我在重新索引中发现了新的参数公差:

print (s2.reindex(s1.index, method='nearest',tolerance='10Min'))
2014-05-06 09:15:34    10.0
2014-05-06 09:34:00     NaN
2014-05-06 11:20:43     NaN
2014-05-07 12:13:00    40.0
2014-05-07 17:29:19    50.0
dtype: float64

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐