首页 > 解决方案 > 在 Pandas DataFrame 中查找具有特定特征的句点

问题描述

我有一个由 TimeStamp 索引的气象 DataFrame,我想在以下条件下找到 DataFrame 中存在的所有可能的 24 小时时段:

  1. 至少 6 小时的降雨量 > 10°C
  2. 至少连续 6 小时的相对湿度 > 90%。

考虑的小时数也可能“重叠”(RH > 90 和降雨量 > 0 的 6 小时就足够了)。

可以通过以下方式创建 48 小时的示例 DataFrame:

df = pd.DataFrame({'TimeStamp': pd.date_range('1/5/2015 00:00:00', periods=48, freq='H'), 
                   'Temperature': np.random.choice( [11,12,13], 48),
                   'Rainfalls': [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.1,0.2,0.3,0.3,0.3,0.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
                   'RelativeHumidity': [95,95,95,95,95,95,80,80,80,80,80,80,80,80,85,85,85,85,85,85,85,85,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80]})

df = df.set_index('TimeStamp') 

在输出中,我只想要具有上述特征的每个时期开始的各种时间戳的索引。在样本 df 的情况下,输出中仅给出第一个 TimeStamp。

我曾尝试使用该df.rolling()功能,但我只找到了 6 小时连续 RH > 90。

在此先感谢您的帮助。

标签: pythonpandas

解决方案


我希望我已经正确理解了你的问题。此示例将查找温度 > 10 和 RH > 90 且最小长度为 6 的所有,然后打印这些组的第一个索引:

x = (df.Temperature > 10).astype(int) + (df.RelativeHumidity > 90).astype(int)
out = (
    x.groupby((x != x.shift(1)).cumsum().values)
    .apply(lambda x: x.index[0] if (x.iat[0] == 2) and len(x) > 5 else np.nan)
    .dropna()
)
print(out)

印刷:

1   2015-01-05
dtype: datetime64[ns]

推荐阅读