如何复制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
相关产品推荐
相关产品推荐

