如何用Pandas重塑DataFrame:拆分日期行并计算日均预算
解决Pandas日期区间拆分为单日记录并计算日均预算的问题
我来帮你搞定这个DataFrame的重塑需求,把每个日期区间拆成单日记录,同时算出对应的日均预算。下面是具体的实现步骤和代码:
步骤1:计算区间天数与日均预算
首先得先算出每个日期区间的总天数(注意要包含首尾两天,所以需要加1),再用总预算除以天数得到日均预算:
import pandas as pd # 初始化你提供的数据集 data = {"start_date" : ["2018-04-30", "2018-05-01"] ,"end_date" : ["2018-05-01", "2018-05-02"] ,"budget" : [10, 12]} df = pd.DataFrame(data) df["start_date"] = pd.to_datetime(df["start_date"]) df["end_date"] = pd.to_datetime(df["end_date"]) # 计算每个区间的总天数 df['days'] = (df['end_date'] - df['start_date']).dt.days + 1 # 计算日均预算 df['daily_average'] = df['budget'] / df['days']
步骤2:拆分日期区间为单日记录
接下来用pd.date_range生成每个区间内的所有日期,再通过explode方法把日期列表拆成单独的行:
# 为每行生成对应的日期序列 df['date'] = df.apply(lambda row: pd.date_range(row['start_date'], row['end_date'], freq='D'), axis=1) # 拆分日期列表,生成单日记录 df = df.explode('date').reset_index(drop=True)
步骤3:调整列顺序(可选)
如果需要和需求中的字段顺序对齐,可以重新排列列的位置:
# 保留需要的字段并调整顺序 df = df[['date', 'daily_average', 'days', 'start_date', 'end_date']]
最终结果
执行完上述代码后,你会得到如下的目标DataFrame:
| date | daily_average | days | start_date | end_date | |
|---|---|---|---|---|---|
| 0 | 2018-04-30 | 5.0 | 2 | 2018-04-30 | 2018-05-01 |
| 1 | 2018-05-01 | 5.0 | 2 | 2018-04-30 | 2018-05-01 |
| 2 | 2018-05-01 | 6.0 | 2 | 2018-05-01 | 2018-05-02 |
| 3 | 2018-05-02 | 6.0 | 2 | 2018-05-01 | 2018-05-02 |
这个结果完全满足需求:每个单日都有独立记录,同时保留了原区间的起始/结束日期、总天数和日均预算。
内容的提问来源于stack exchange,提问作者Florin Radu
相关产品推荐
相关产品推荐

