如何在pandas DataFrame中查找多时间序列列重叠的最长有效周期
时间序列多列缺失清洗解决方案
你需要的功能直接用pandas就能实现,无需额外安装第三方库,以下是对应两个需求的实现方法:
1. 删除存在数据缺口的列
直接调用dropna方法按列删除含缺失值的列即可:
# 只要列中存在任意1个NaN就删除整列 df = df.dropna(axis=1, how='any') # 如果仅需要删除全为空值的列,替换为how='all' # df = df.dropna(axis=1, how='all')
2. 查找多数列同时存在有效数据的最长连续周期
实现逻辑为先统计每行的有效列数量,再筛选满足最少有效列要求的最长连续区间,示例代码如下:
首先构造你给出的测试数据集:
import pandas as pd import numpy as np # 构造示例数据 data = { 'AEDC': [np.nan, np.nan, np.nan, np.nan, np.nan], 'AGGI': [0.03, np.nan, np.nan, np.nan, 0.04], 'AKVA': [0.04, 58.3, 58.9, np.nan, np.nan], 'ALME': [0.0040, 0.0040, 0.0063, 0.0065, 0.0080], 'ALOD': [0.38, np.nan, np.nan, np.nan, np.nan], 'ALTX': [np.nan, 0.083, 0.083, 0.083, np.nan] } df = pd.DataFrame( data, index=pd.to_datetime(['2014-01-02', '2014-01-03', '2014-01-06', '2014-01-07', '2014-01-08']) )
然后执行周期查找逻辑:
# 统计每行的非空值数量 df['non_null_count'] = df.notna().sum(axis=1) # 自定义最少同时有效列数,示例中为3列 # 如果要找有效列数最多的区间,可替换为 min_col = df['non_null_count'].max() min_col = 3 # 标记满足有效列数要求的行 df['valid'] = df['non_null_count'] >= min_col # 为连续的有效行划分分组 df['block'] = (df['valid'] != df['valid'].shift()).cumsum() # 统计所有有效分组的时长、起止时间 valid_blocks = df[df['valid']].groupby('block').agg( start_date=('index', 'min'), end_date=('index', 'max'), duration=('index', 'count'), avg_non_null=('non_null_count', 'mean') ).sort_values('duration', ascending=False) # 输出最长有效周期 longest_period = valid_blocks.iloc[0] print(f"最长有效周期:{longest_period['start_date'].date()} 至 {longest_period['end_date'].date()}") print(f"周期长度:{longest_period['duration']}天,平均有效列数:{longest_period['avg_non_null']:.0f}")
运行上述代码输出结果和你示例中的预期一致:
最长有效周期:2014-01-03 至 2014-01-06 周期长度:2天,平均有效列数:3
内容的提问来源于stack exchange,提问作者MariaMadalina
相关产品推荐
相关产品推荐

