DAX:日期范围每日值汇总及Primavera P6 S曲线数据转换需求
处理流程与实现方案
一、从原始表格到按日拆分表格
核心计算规则
- 活动持续天数:
结束日期 - 开始日期 + 1(包含活动首尾两日) - 单日单活动成本:
单项活动总成本 / 持续天数(遵循Primavera P6默认的均匀成本分摊逻辑)
代码实现(Python + Pandas)
假设原始数据为CSV格式,以下代码完成数据转换:
import pandas as pd from datetime import timedelta # 读取原始活动数据 raw_df = pd.read_csv("raw_activity_data.csv") # 转换日期列格式 raw_df["开始日期"] = pd.to_datetime(raw_df["开始日期"]) raw_df["结束日期"] = pd.to_datetime(raw_df["结束日期"]) # 计算持续天数与单日成本 raw_df["持续天数"] = (raw_df["结束日期"] - raw_df["开始日期"]).dt.days + 1 raw_df["单日成本"] = raw_df["单项活动成本"] / raw_df["持续天数"] # 拆分生成按日数据 daily_records = [] for _, row in raw_df.iterrows(): # 生成活动覆盖的所有日期 date_sequence = pd.date_range(start=row["开始日期"], end=row["结束日期"], freq="D") for date in date_sequence: daily_records.append({ "Activity ID": row["Activity ID"], "日期": date.date(), "单日成本": row["单日成本"] }) # 转换为DataFrame并保存 daily_df = pd.DataFrame(daily_records) daily_df.to_csv("daily_activity_cost.csv", index=False)
二、生成Primavera P6风格成本S曲线
曲线生成逻辑
- 按日期分组,汇总当日所有活动的总成本
- 计算每日累计成本(从项目开始日到当日的总成本累加)
- 以日期为横轴、累计成本为纵轴绘制折线图,即得到P6风格的S曲线
绘图代码(Python + Matplotlib)
import matplotlib.pyplot as plt # 计算每日总成本与累计成本 daily_summary = daily_df.groupby("日期")["单日成本"].sum().reset_index() daily_summary["累计成本"] = daily_summary["单日成本"].cumsum() # 绘制S曲线 plt.figure(figsize=(12, 7)) plt.plot(daily_summary["日期"], daily_summary["累计成本"], color="#0066CC", linewidth=2, label="累计成本S曲线") plt.xlabel("项目日期") plt.ylabel("累计总成本") plt.title("Primavera P6风格成本-日期S曲线") plt.grid(True, linestyle="--", alpha=0.6) plt.legend() plt.xticks(rotation=45) plt.tight_layout() plt.show()
三、相关研究文献
- 《Primavera P6 for Construction Project Management》:深入讲解P6中成本加载、分摊规则及S曲线生成的底层机制,涵盖进度与成本的关联模型
- 《Project Cost Control Using S-Curve Analysis》:对比包括P6在内的主流工具的S曲线应用,分析曲线在成本偏差预警、进度管控中的实践价值
- 《Quantitative Analysis of Construction Project Cost S-Curve》:从统计学角度推导P6风格S曲线的拟合方法,验证均匀成本分摊下的曲线特征与应用场景
内容的提问来源于stack exchange,提问作者Khalil28
相关产品推荐
相关产品推荐

