如何基于datetime列将单条预订记录拆分为逐小时的多行数据
实现方案
你可以用pandas完成这个拆分需求,具体实现步骤和代码如下:
前置准备
首先确保你已经安装了pandas,导入依赖:
import pandas as pd from datetime import timedelta
步骤1:加载数据并转换时间字段格式
首先把原始数据里的Start Date和End Date转换成datetime类型,方便后续时间计算:
# 示例加载数据,你可以替换成你自己的读数据逻辑,比如pd.read_excel、pd.read_csv df = pd.DataFrame([ ["abc@corp.com", "L11M2", "2021-02-01 08:00:00", "2021-02-01 11:00:00"], ["xyz@corp.com", "L12M4", "2021-02-01 08:00:00", "2021-02-01 10:00:00"] ], columns=["email", "room", "Start Date", "End Date"]) # 转换时间字段类型 df["Start Date"] = pd.to_datetime(df["Start Date"]) df["End Date"] = pd.to_datetime(df["End Date"])
步骤2:生成每小时时段列表并拆分
对每行数据生成所有对应的一小时时段,再展开成多行即可:
# 定义函数:输入单行数据,返回所有拆分后的(开始时间, 结束时间)元组列表 def split_hourly(row): hours = int((row["End Date"] - row["Start Date"]).total_seconds() / 3600) time_slots = [] for i in range(hours): start = row["Start Date"] + timedelta(hours=i) end = start + timedelta(hours=1) time_slots.append((start, end)) return time_slots # 生成时段列 df["time_slots"] = df.apply(split_hourly, axis=1) # 展开时段列为多行 df = df.explode("time_slots") # 拆分时段列到Start Date和End Date df[["Start Date", "End Date"]] = pd.DataFrame(df["time_slots"].tolist(), index=df.index) # 删除多余的辅助列 df = df.drop("time_slots", axis=1) # 输出结果,如果需要保持字符串格式可以转回去 df["Start Date"] = df["Start Date"].dt.strftime("%Y-%m-%d %H:%M:%S") df["End Date"] = df["End Date"].dt.strftime("%Y-%m-%d %H:%M:%S") print(df)
运行上述代码就会得到你需要的输出结果。如果你的原始数据存在不是整小时的预订记录,可以先做一轮数据校验,过滤或者取整后再执行拆分逻辑。
内容的提问来源于stack exchange,提问作者sok09
相关产品推荐
相关产品推荐

