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
中更高时间分辨率的一些统计数据作为新列应用到大df
。 df_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.cut
、bin
或pd.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_asof
asof
【参考方案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')
【讨论】:
需要通过在相同的dtype
和pd.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:如何将两个不完整的数据帧合并或合并为一个完整的数据帧