Pandas滚动日期窗口求最频繁weather_type及平局处理技术问询
嘿,这个需求刚好可以用你熟悉的滑动窗口思路来解决!我来一步步给你拆解实现方法:
第一步:确保日期列是datetime类型并排序
首先得把你的日期列转成datetime格式,并且按日期排序——这一步非常关键,不然滑动窗口的范围会乱掉:
import pandas as pd # 转换日期列格式 df['date'] = pd.to_datetime(df['date']) # 按日期排序并重置索引 df = df.sort_values('date').reset_index(drop=True)
第二步:自定义处理平局的众数函数
我们需要一个函数,输入窗口内的weather_type序列,返回出现最频繁的值;如果多个值频率相同,就返回窗口内**最后出现(也就是最近)**的那个值:
def get_top_weather(series): # 统计窗口内各天气类型的出现次数 count_stats = series.value_counts() # 找到最高出现频次 max_count = count_stats.max() # 筛选出所有频次等于最大值的候选天气类型 top_candidates = count_stats[count_stats == max_count].index.tolist() # 从窗口末尾往前找,第一个匹配候选的就是最近的那个 for weather in reversed(series): if weather in top_candidates: return weather
第三步:滑动窗口应用函数
接下来就像你计算precipmm总和一样,用rolling窗口来应用这个函数:
# 方案1:如果日期是连续的,用固定窗口大小3(包含当天在内的过去3天) df['most_freq_weather_3d'] = df['weather_type'].rolling(window=3, min_periods=1).apply(get_top_weather) # 方案2:如果日期可能有缺失,用时间范围窗口(过去3天内的所有数据) # 先把日期设为索引,应用窗口后再重置索引 df['most_freq_weather_3d'] = df.set_index('date')['weather_type'].rolling('3D', min_periods=1).apply(get_top_weather).reset_index(drop=True)
举个例子验证
假设你的数据是这样的:
data = { 'date': pd.date_range(start='2024-01-01', periods=5), 'weather_type': ['sunny', 'rainy', 'rainy', 'sunny', 'cloudy'] } df = pd.DataFrame(data)
应用函数后得到的结果会是:
| date | weather_type | most_freq_weather_3d |
|---|---|---|
| 2024-01-01 | sunny | sunny |
| 2024-01-02 | rainy | rainy |
| 2024-01-03 | rainy | rainy |
| 2024-01-04 | sunny | rainy |
| 2024-01-05 | cloudy | cloudy |
注意点
min_periods=1是为了让前两行(不足3天的情况)也能返回结果,如果你不需要的话可以去掉,这时候前两行会显示NaN。- 用时间窗口
'3D'时,会自动包含过去72小时内的所有数据,哪怕中间有日期缺失,比固定窗口更灵活。
内容的提问来源于stack exchange,提问作者Colin Blyth
相关产品推荐
相关产品推荐

