多时间序列合并与NaN值按小时填充问题(TSfresh分析场景)
问题描述
我尝试合并心率、动脉压等临床记录的多个时间序列用于TSfresh分析,这些序列时间步长不同:
- df1、df2为分钟级数据:
df1 = pd.read_csv("PATH", delimiter='\t', header=None, index_col=0) Values Date 06/03/2021 17:22 30 06/03/2021 17:23 30 06/03/2021 17:24 30 ... .. df2 = pd.read_csv("PATH", delimiter='\t', header=None, index_col=0) Values Date 06/03/2021 17:22 8,7 06/03/2021 17:23 8,6 06/03/2021 17:24 8,7 ... ...
- df3为小时级数据:
df3 = pd.read_csv("PATH", delimiter='\t', header=None, index_col=0) Values Date 06/03/2021 17:00 1 06/03/2021 18:00 1 06/03/2021 19:00 1 06/03/2021 20:00 3 ...
用pd.concat([df1,df2,df3], ignore_index=True, axis=1)合并后,仅三个序列共有的整点时刻有Values3值,其余为NaN,需求是将每个小时内的所有时刻都填充对应小时的df3值,比如17:**的所有行Values3为1,20:**的所有行Values3为3。
解决方案
步骤1:统一时间索引为datetime类型
先将所有DataFrame的字符串索引转换为datetime类型,方便后续时间操作:
import pandas as pd # 处理df1 df1.index = pd.to_datetime(df1.index) df1.columns = ['Values1'] # 处理df2:把逗号格式的小数点转为点,再转数值类型 df2.index = pd.to_datetime(df2.index) df2['Values'] = df2['Values'].str.replace(',', '.').astype(float) df2.columns = ['Values2'] # 处理df3 df3.index = pd.to_datetime(df3.index) df3.columns = ['Values3']
步骤2:扩展df3到分钟级并填充
将小时级的df3扩展为分钟级,用前向填充把整点的值覆盖到该小时内的所有分钟:
# 按分钟重采样,用前向填充补充缺失值 df3_resampled = df3.resample('T').ffill()
步骤3:合并三个序列
用join方法合并,确保所有分钟级时刻都能匹配到对应的Values3:
# 依次合并三个DataFrame new_df = df1.join(df2).join(df3_resampled)
备选方案:直接处理已合并的new DataFrame
如果已经有了合并后的new DataFrame,可直接对Values3列做填充:
# 先转换索引为datetime类型 new.index = pd.to_datetime(new.index) # 构建小时到Values3值的映射字典 hour_map = df3.groupby(df3.index.floor('H'))['Values3'].first().to_dict() # 用日期+小时匹配映射值,填充NaN new['Values3'] = new.index.floor('H').map(hour_map)
最终效果
处理后DataFrame会呈现如下格式:
Values1 Values2 Values3 Date 2021-03-06 17:22 30.0 8.7 1 2021-03-06 17:23 30.0 8.6 1 2021-03-06 17:24 30.0 8.7 1 ... 2021-03-06 18:00 32.0 9.5 1 2021-03-06 18:01 32.0 9.5 1 ... 2021-03-06 20:00 32.0 9.5 3 2021-03-06 20:01 32.0 9.5 3
内容的提问来源于stack exchange,提问作者Romain LOMBARDI
相关产品推荐
相关产品推荐

