You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何复制Pandas DataFrame行,使两个时间戳列区间内的每一天各占一行

Pandas 时间区间展开为单日行解决方案

首先提前做数据类型转换,确保两个时间列是datetime格式:

import pandas as pd

# 转换时间列类型
df['Starttimeofvalidity'] = pd.to_datetime(df['Starttimeofvalidity'])
df['Endtimeofvalidity'] = pd.to_datetime(df['Endtimeofvalidity'])

方案1:直接展开保留原数值(和你期望的输出样式完全一致)

利用date_range生成日期列表+explode炸开实现,代码简洁性能优秀,8万行数据可正常运行:

# 为每行生成起止时间范围内的所有日期列表
df['Date'] = df.apply(
    lambda x: pd.date_range(start=x['Starttimeofvalidity'], end=x['Endtimeofvalidity'], freq='D'),
    axis=1
)
# 把日期列表炸开,每个日期单独占一行
df_exploded = df.explode('Date', ignore_index=True)
# 提取目标列,调整为你需要的顺序
df_result = df_exploded[['Date', 'PointName', 'tariff']]

方案2:按区间总天数分摊tariff数值

如果需要把总tariff平摊到每一天,只需增加两步计算即可:

# 计算每个时间区间的总天数(含首尾日)
df['total_days'] = (df['Endtimeofvalidity'] - df['Starttimeofvalidity']).dt.days + 1
# 计算每日分摊的tariff值
df['daily_tariff'] = df['tariff'] / df['total_days']

# 后续生成日期、炸开逻辑和方案1一致
df['Date'] = df.apply(
    lambda x: pd.date_range(start=x['Starttimeofvalidity'], end=x['Endtimeofvalidity'], freq='D'),
    axis=1
)
df_exploded = df.explode('Date', ignore_index=True)
df_result = df_exploded[['Date', 'PointName', 'daily_tariff']]

内容的提问来源于stack exchange,提问作者neutralname

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:18:03