我想获取包含时间间隔和时间重复的数据,并基本上使用任何给定时间的第一次出现并向前填充来创建时间序列。请考虑以下示例。
假设这是我们感兴趣的时间范围:
时间 |
---|
1:00 |
1:01 |
1:02 |
1:03 |
1:04 |
1:05 |
merge_asof
请参阅下面的解决方案以查看最终解决方案。
首先,我们需要将这些列更改为pd.Timedelta
:
df1['Time'] = pd.to_timedelta(df1['Time'] + ':00')
df2['Occurance'] = pd.to_timedelta(df2['Occurance'] + ':00')
然后我们可以merge_asof
pd.merge_asof(df1, df2, left_on='Time', right_on='Occurance')
Time Occurance Value
0 0 days 01:00:00 0 days 01:00:00 R
1 0 days 01:01:00 0 days 01:00:00 R
2 0 days 01:02:00 0 days 01:00:00 R
3 0 days 01:03:00 0 days 01:03:00 T
4 0 days 01:04:00 0 days 01:03:00 T
5 0 days 01:05:00 0 days 01:05:00 S
这有几个问题:
- 列数超过指定的OP
- 我有
T
秒而不是G
秒
好的,为了去掉这些列,我们只重命名其中一列,而不是使用left_on
/right_on
pd.merge_asof(df1.set_axis(['Occurance'], axis=1), df2)
Occurance Value
0 0 days 01:00:00 R
1 0 days 01:01:00 R
2 0 days 01:02:00 R
3 0 days 01:03:00 T
4 0 days 01:04:00 T
5 0 days 01:05:00 S
但我们仍然有T
s而不是G
s,这是因为看看df2
Occurance Value
0 0 days 01:00:00 R
1 0 days 01:03:00 G # same Occurance
2 0 days 01:03:00 L # same Occurance
3 0 days 01:03:00 P # same Occurance
4 0 days 01:03:00 T # same Occurance
5 0 days 01:05:00 S
显然,潘达斯拿了最后一个,而OP想要第一个。所以让我们用drop_duplicates
再试一次
解决方案
pd.merge_asof(df1.set_axis(['Occurance'], axis=1),
df2.drop_duplicates('Occurance'))
Occurance Value
0 0 days 01:00:00 R
1 0 days 01:01:00 R
2 0 days 01:02:00 R
3 0 days 01:03:00 G
4 0 days 01:04:00 G
5 0 days 01:05:00 S