Pandas如何编写按时间段调整日期的函数,实现SQL PARTITION BY效果
解决方案
我们可以通过groupby结合自定义分组处理函数实现需求,核心逻辑是在每个id分组内按时间升序遍历,动态更新基准时间完成滑动2天窗口的时间聚合,效果等同于SQL的PARTITION BY id窗口逻辑。
完整实现代码
import pandas as pd def process_id_group(dt_series): # 组内先按时间升序排序 sorted_dt = dt_series.sort_values() current_base = sorted_dt.iloc[0] res = [] for dt in sorted_dt: # 按需求调整时间差阈值,此处<2匹配示例预期,如需包含刚好2天可改为<=2 if (dt - current_base).days < 2: res.append(current_base) else: current_base = dt res.append(current_base) # 返回和原始索引对齐的结果,保证分组处理后行顺序不错乱 return pd.Series(res, index=sorted_dt.index) # 测试示例 d1 = {'id': ['a','a','a','a','b','a','b'], 'datetime': ['10/25/2021 0:00','10/26/2021 0:00','11/28/2021 0:00','11/29/2021 0:00','11/29/2021 0:00', '11/30/2021 0:00', '11/30/2021 0:00']} df1 = pd.DataFrame(d1) df1['datetime'] = pd.to_datetime(df1['datetime']) # 按id分组执行处理逻辑 df1['datetime'] = df1.groupby('id')['datetime'].transform(process_id_group) # 按id、时间排序后和期望输出完全一致 df1 = df1.sort_values(by=['id', 'datetime']).reset_index(drop=True)
结果验证
处理后的df1输出和预期完全匹配:
| id | datetime |
|---|---|
| a | 2021-10-25 00:00:00 |
| a | 2021-10-25 00:00:00 |
| a | 2021-11-28 00:00:00 |
| a | 2021-11-28 00:00:00 |
| a | 2021-11-30 00:00:00 |
| b | 2021-11-29 00:00:00 |
| b | 2021-11-29 00:00:00 |
内容的提问来源于stack exchange,提问作者chicagobeast12
相关产品推荐
相关产品推荐

