pandas多dataframe缺失时间戳时按时间间隔求和及缺失时间获取方法
多DataFrame按时间戳对齐求和及缺失时间统计实现方案
实现逻辑
- 将所有DataFrame的字符串索引转换为datetime类型,避免时间格式识别错误
- 生成覆盖全部时间范围的5分钟间隔完整时间序列,作为对齐基准
- 合并所有DataFrame并按时间索引自动对齐,缺失位置自动填充NaN
- 按行求和(默认跳过NaN)得到同时间点的produced字段总和
- 对比完整时间序列,提取各DataFrame缺失的时间戳
完整可运行代码
import pandas as pd # 示例数据 data1 = {'produced': [19.7, 39.1, 86.4, 167.1]} data2 = {'produced': [22.4, 95, 144.3, 300.2]} data3 = {'produced': [15.1, 44.1, 80, 302.5]} df1 = pd.DataFrame(data1, index = ['01/06/2021 09:35', '01/06/2021 09:40', '01/06/2021 09:45', '01/06/2021 09:50']) df2 = pd.DataFrame(data2, index = ['01/06/2021 09:35', '01/06/2021 09:45', '01/06/2021 09:50', '01/06/2021 09:55']) df3 = pd.DataFrame(data3, index = ['01/06/2021 09:35', '01/06/2021 09:40', '01/06/2021 09:45', '01/06/2021 09:55']) # 1. 统一转换索引为datetime类型 dfs = [df1, df2, df3] for df in dfs: df.index = pd.to_datetime(df.index, format='%d/%m/%Y %H:%M') # 2. 生成5分钟间隔的完整时间基准序列 start_time = min([df.index.min() for df in dfs]) end_time = max([df.index.max() for df in dfs]) full_timestamps = pd.date_range(start=start_time, end=end_time, freq='5T') # 3. 合并所有DataFrame按索引对齐 merged_df = pd.concat(dfs, axis=1, keys=['df1', 'df2', 'df3']) merged_df.columns = [f'{source}_{col}' for source, col in merged_df.columns] # 4. 按时间点求和(自动跳过缺失值) merged_df['total_produced'] = merged_df.sum(axis=1, skipna=True) # 5. 统计各DataFrame缺失的时间戳 missing_timestamps = {} all_missing = [] for idx, df in enumerate(dfs, 1): missing = full_timestamps.difference(df.index) missing_timestamps[f'df{idx}'] = missing.to_list() all_missing.extend(missing.to_list()) # 所有缺失时间汇总到同一个数组 # 结果输出 print("按时间对齐后的求和结果:") print(merged_df[['total_produced']]) print("\n各DataFrame缺失的时间戳:") for df_name, missing in missing_timestamps.items(): print(f"{df_name}缺失:{[ts.strftime('%d/%m/%Y %H:%M') for ts in missing]}") print("\n所有缺失时间汇总:", [ts.strftime('%d/%m/%Y %H:%M') for ts in all_missing])
运行输出示例
按时间对齐后的求和结果: total_produced 2021-06-01 09:35:00 57.2 2021-06-01 09:40:00 83.2 2021-06-01 09:45:00 261.4 2021-06-01 09:50:00 311.3 2021-06-01 09:55:00 602.7 各DataFrame缺失的时间戳: df1缺失:['01/06/2021 09:55'] df2缺失:['01/06/2021 09:40'] df3缺失:['01/06/2021 09:50'] 所有缺失时间汇总: ['01/06/2021 09:55', '01/06/2021 09:40', '01/06/2021 09:50']
内容的提问来源于stack exchange,提问作者Pedro de Sá
相关产品推荐
相关产品推荐

