当前位置: 首页 > news >正文

pandas小时级别对其数据的写法

pandas小时级别对其数据的写法

def resample_to_hourly(df):"""将数据重采样为小时对齐,取目标小时前后1小时窗口内**时间最近**的一条记录向量化实现,无循环,大幅提升效率"""# 确保 datetime 列为 datetime 类型df = df.copy()df["datetime"] = pd.to_datetime(df["datetime"])# 1. 生成全局小时刻度start_h = df["datetime"].min().floor("H")end_h = df["datetime"].max().ceil("H")hourly_ticks = pd.date_range(start=start_h, end=end_h, freq="H", name="fixed_time")# 2. 按 userid 分组,使用 merge_asof 做【时间最近匹配】res_list = []for uid, group in df.groupby("userid"):# 排序:merge_asof 要求右表有序   group = group.sort_values("datetime")ticks_df = pd.DataFrame({"fixed_time": hourly_ticks})# 左右各1小时窗口,匹配最近时间点matched = pd.merge_asof( # 近似merge算法.left=ticks_df,right=group,left_on="fixed_time",right_on="datetime",direction="nearest",       # 取最近tolerance=pd.Timedelta(hours=1)  # 时间窗口 ±1h)# 剔除窗口内无数据的空行matched = matched.dropna(subset=["datetime"])res_list.append(matched)# 合并所有用户结果result = pd.concat(res_list, ignore_index=True)# 计算时间差(可选,和原逻辑保持一致)result["delta_time"] = (result["datetime"] - result["fixed_time"]).abs()return result