如何计算分钟级时间差并重新填充DataFrame
问题
我有一份已转换为DataFrame的时间序列数据,第一列为timestamp(列名date),其余列的列名也都是timestamp格式。原始DataFrame如下:
date 2022-01-02 10:20:00 2022-01-02 10:25:00 2022-01-02 10:30:00 2022-01-02 10:35:00 2022-01-02 10:40:00 2022-01-02 10:45:00 2022-01-02 10:50:00 2022-01-02 10:55:00 2022-01-02 11:00:00 2022-01-02 10:30:00 25.5 26.3 26.9 NaN NaN NaN NaN NaN NaN 2022-01-02 10:45:00 60.3 59.3 59.2 58.4 56.9 58.0 NaN NaN NaN 2022-01-02 11:00:00 43.7 43.9 48 48 48.1 48.9 49 49.5 49.5
注意:当date列的值与列名匹配时,该列之后的所有数值均为NaN。
我希望将列名改为相对于date列对应行的分钟差值(格式如40mins、35mins…0mins),并对应填充数值,目标DataFrame如下:
date 40mins 35mins 30mins 25mins 20mins 15mins 10mins 5mins 0mins 2022-01-02 10:30:00 24* 24* 24.8* 24.8* 25* 25* 25.5 26.3 26.9 2022-01-02 10:45:00 59* 58* 60* 60.3 59.3 59.2 58.4 56.9 58.0 2022-01-02 11:00:00 43.7 43.9 48 48 48.1 48.9 49 49.5 49.5
示例说明:
- 2022-01-02 10:30:00与2022-01-02 10:30:00的时间差为0分钟,对应值为26.9;
- 2022-01-02 10:30:00与2022-01-02 10:25:00的时间差为5分钟,对应值为26.3,以此类推。
注:带*的值为示例占位符,实际DataFrame包含更多列。
解决方案
步骤1:统一时间格式
先将DataFrame的索引(date列)和所有列名转换为datetime类型,方便后续计算时间差:
import pandas as pd # 假设原始数据已读入变量df df.index = pd.to_datetime(df.index) df.columns = pd.to_datetime(df.columns)
步骤2:计算时间差并重组数据
遍历每行数据,计算当前行索引时间与各列名的分钟差,筛选有效数据后补全缺失的时间差列(对应占位符),最后按目标列顺序排序:
# 定义时间间隔(根据数据规律为5分钟) interval = 5 # 目标列的最大时间差(根据示例为40分钟) max_diff = 40 processed_rows = [] for idx, row in df.iterrows(): # 筛选当前行非NaN的列 valid_cols = row.dropna().index # 计算时间差(取正值,单位:分钟) time_diffs = (idx - valid_cols).total_seconds() // 60 # 构建时间差列名与对应值的字典 temp_data = {f"{int(diff)}mins": row[col] for diff, col in zip(time_diffs, valid_cols)} # 补全所有需要的时间差列,缺失值用占位符填充 for diff in range(max_diff, -1, -interval): col_name = f"{diff}mins" if col_name not in temp_data: temp_data[col_name] = "24*" # 替换为你需要的占位符 # 按目标列顺序整理数据,添加date索引 sorted_data = {col: temp_data[col] for col in [f"{d}mins" for d in range(max_diff, -1, -interval)]} sorted_data['date'] = idx processed_rows.append(sorted_data) # 转换为目标格式的DataFrame result_df = pd.DataFrame(processed_rows).set_index('date')
步骤3:验证输出
运行上述代码后,result_df将与目标格式完全一致,缺失的数值会被填充为指定的占位符。
内容的提问来源于stack exchange,提问作者A Newbie
相关产品推荐
相关产品推荐

