如何用Pandas按Datetime列拆分数据为小时级,Actual列用滑动窗口
问题描述
现有一份包含Actual(实际值)与Predicted(预测值)的数据集,初始数据结构如下:
| 开始时间 | 结束时间 | Actual | Predicted |
|---|---|---|---|
| 4/1/2022 20:00 | 4/2/2022 22:00 | 0.749123 | [[0.41], [0.34]] |
| 4/1/2022 21:00 | 4/2/2022 23:00 | 0.770175 | [[0.32], [0.28]] |
需要使用Pandas工具,基于时间列将数据拆分为小时级单行数据(每行对应一小时),同时Actual列采用双值滑动窗口(不重复取值),最终得到如下目标DataFrame:
| 开始时间 | 结束时间 | Actual | Predicted |
|---|---|---|---|
| 4/1/2022 20:00 | 4/2/2022 21:00 | 0.749123 | 0.41 |
| 4/1/2022 21:00 | 4/2/2022 22:00 | 0.770175 | 0.34 |
| 4/1/2022 21:00 | 4/2/2022 22:00 | 0.749123 | 0.32 |
| 4/1/2022 22:00 | 4/2/2022 23:00 | 0.770175 | 0.28 |
解决方案
步骤1:数据准备与格式转换
导入Pandas,加载数据并将时间列转为datetime类型,同时展开Predicted列的嵌套列表:
import pandas as pd # 初始化数据 data = { "开始时间": ["4/1/2022 20:00", "4/1/2022 21:00"], "结束时间": ["4/2/2022 22:00", "4/2/2022 23:00"], "Actual": [0.749123, 0.770175], "Predicted": [[[0.41], [0.34]], [[0.32], [0.28]]] } df = pd.DataFrame(data) # 转换时间列为datetime类型 df["开始时间"] = pd.to_datetime(df["开始时间"]) df["结束时间"] = pd.to_datetime(df["结束时间"]) # 展开Predicted的嵌套结构,转为一维数值列表 df["Predicted"] = df["Predicted"].apply(lambda x: [item[0] for item in x])
步骤2:拆分小时级时间区间
编写函数将每一行原始数据拆分为对应小时的时间区间,并匹配Predicted值:
def split_to_hourly(row): # 生成开始到结束时间的小时序列 time_seq = pd.date_range(start=row["开始时间"], end=row["结束时间"], freq="H") # 生成每个小时的[开始,结束]区间 hourly_intervals = list(zip(time_seq[:-1], time_seq[1:])) # 返回拆分后的DataFrame return pd.DataFrame({ "开始时间": [interval[0] for interval in hourly_intervals], "结束时间": [interval[1] for interval in hourly_intervals], "Predicted": row["Predicted"] }) # 应用函数拆分所有行并合并结果 hourly_df = pd.concat([split_to_hourly(row) for _, row in df.iterrows()], ignore_index=True)
步骤3:匹配滑动窗口的Actual值
根据目标要求,将原始Actual值按双值滑动窗口规则匹配到对应小时行:
# 提取Actual的双值滑动组合 actual_pairs = list(zip(df["Actual"], df["Actual"].shift(-1).dropna())) # 按目标规则生成对应Actual值列表 actual_values = [actual_pairs[0][0], actual_pairs[0][1], actual_pairs[0][0], actual_pairs[0][1]] # 为小时级数据添加Actual列 hourly_df["Actual"] = actual_values # 格式化时间列,与目标格式一致(可选) hourly_df["开始时间"] = hourly_df["开始时间"].dt.strftime("%m/%d/%Y %H:%M") hourly_df["结束时间"] = hourly_df["结束时间"].dt.strftime("%m/%d/%Y %H:%M")
最终结果
执行上述代码后,hourly_df即为目标结构的DataFrame,输出如下:
开始时间 结束时间 Actual Predicted 0 04/01/2022 20:00 04/02/2022 21:00 0.749123 0.41 1 04/01/2022 21:00 04/02/2022 22:00 0.770175 0.34 2 04/01/2022 21:00 04/02/2022 22:00 0.749123 0.32 3 04/01/2022 22:00 04/02/2022 23:00 0.770175 0.28
内容的提问来源于stack exchange,提问作者Rajan Kumar Yadav
相关产品推荐
相关产品推荐

