创建时间序列数据帧的最快方法



我想获取包含时间间隔和时间重复的数据,并基本上使用任何给定时间的第一次出现并向前填充来创建时间序列。请考虑以下示例。

假设这是我们感兴趣的时间范围:

时间
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

这有几个问题:

  1. 列数超过指定的OP
  2. 我有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

但我们仍然有Ts而不是Gs,这是因为看看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

相关内容

最新更新