Pandas 基于时间窗口合并两个时间序列数据帧(cut/bin/merge)

Posted

技术标签:

【中文标题】Pandas 基于时间窗口合并两个时间序列数据帧(cut/bin/merge)【英文标题】:Pandas merge two time series dataframes based on time window (cut/bin/merge) 【发布时间】:2020-08-07 11:42:12 【问题描述】:

有 750k 行 df 和 15 列,pd.Timestamp 作为 index 称为 ts。 我以近乎实时的方式处理低至毫秒的实时数据。

现在我想将来自df_stats 中更高时间分辨率的一些统计数据作为新列应用到大dfdf_stats 的时间分辨率为 1 分钟。

$ df
+----------------+---+---------+
| ts             | A | new_col |
+----------------+---+---------+
| 11:33:11.31234 | 1 | 81      |
+----------------+---+---------+
| 11:33:11.64257 | 2 | 81      |
+----------------+---+---------+
| 11:34:10.12345 | 3 | 60      |
+----------------+---+---------+
$ df_stats
+----------------+----------------+
| ts             | new_col_source |
+----------------+----------------+
| 11:33:00.00000 | 81             |
+----------------+----------------+
| 11:34:00.00000 | 60             |
+----------------+----------------+

目前我有下面的代码,但效率低下,因为它需要遍历完整的数据。

我想知道使用pd.cutbinpd.Grouper 是否有更简单的解决方案?或者其他什么来合并两个索引上的时间桶?

df_stats['ts_timeonly'] = df.index.map(lambda x: x.replace(second=0, microsecond=0))
df['ts_timeonly'] = df.index.map(lambda x: x.replace(second=0, microsecond=0))
df = df.merge(df_stats, on='ts_timeonly', how='left', sort=True, suffixes=['', '_hist']).set_index('ts')

【问题讨论】:

你试过了吗pd.merge_asofasof 【参考方案1】:

让我们尝试一些新的东西reindex

df_stats=df_stats.set_index('ts').reindex(df['ts'], method='nearest')
df_stats.index=df.index

df=pd.concat([df,df_stats],axis=1)

或者

df=pd.merge_asof(df, df_stats, on='ts',direction='nearest')

【讨论】:

需要通过在相同的dtypepd.merge_asof 上获取两列来解决TypeError: No matching signature found). 之前的问题。它运作良好,但不是很快。我也尝试使用索引:pd.merge_asof(df,df_stats, left_index=True, right_index=True, direction='backward')。现在将尝试您的其他解决方案。 在调试器中打开了很多东西并再次尝试独立运行。 pd.merge_asof 使用上述参数可以非常快速地工作。完成 - 谢谢! @gies0r 太棒了~编码愉快~

以上是关于Pandas 基于时间窗口合并两个时间序列数据帧(cut/bin/merge)的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:如何在两个不同的重叠时间序列上合并两个数据帧

使用不同的时间间隔合并并填充Pandas中的两个数据帧

Pandas:如何将两个不完整的数据帧合并或合并为一个完整的数据帧

如何基于多个条件更快地合并 2 个 pandas 数据帧

合并两个 Pandas 数据帧,在一个时间列上重新采样,插值

当我合并两个 Pandas 数据帧时出现 MemoryError