Pandas如何合并交替日期的两个序列生成分组日期范围DataFrame
Pandas交替周期序列聚合方案
两个序列的周期是交替衔接的,不需要写复杂的匹配逻辑,只要把所有节点按日期排序后,用错位计算就能直接得到结果,实现步骤如下:
基础三列输出版本
- 先把两个Series分别标记周期类型,合并后按日期升序排列
import pandas as pd # 替换成你实际的两个Series即可 s_period1 = pd.Series( [310.62, 300.05, 322.64, 326.54], index=pd.to_datetime(["2020-06-22", "2020-06-26", "2020-09-23", "2020-10-30"]), name="val" ) s_period2 = pd.Series( [312.05, 357.70, 352.43, 384.39], index=pd.to_datetime(["2020-06-23", "2020-09-02", "2020-10-12", "2021-01-25"]), name="val" ) # 标记周期类型后合并排序 df1 = s_period1.reset_index().rename(columns={"index":"DATE"}) df1["PERIOD"] = 1 df2 = s_period2.reset_index().rename(columns={"index":"DATE"}) df2["PERIOD"] = 2 df = pd.concat([df1, df2]).sort_values("DATE", ignore_index=True)
- 错位计算变动量,上一行的数值就是当前周期的起始值
# 如果要和示例里的正数值完全一致,把下面的表达式套一层abs()即可 df["CHG"] = (df["val"] - df["val"].shift(1)).round(2) # 取需要的列得到最终结果 result_basic = df[["DATE", "CHG", "PERIOD"]]
运行后得到的结果和给出的示例结构完全一致,仅下跌周期的CHG会显示为负值,属于正确计算结果;如果只需要展示变动幅度,计算时加abs()就能得到示例里的正数值。
进阶带日期范围版本
如果需要每个周期的明确起止日期,只要把上一行的日期作为当前周期的起始日期即可:
df["START_DATE"] = df["DATE"].shift(1) df["END_DATE"] = df["DATE"] df["START_VAL"] = df["val"].shift(1) df["END_VAL"] = df["val"] result_with_range = df[["START_DATE", "END_DATE", "START_VAL", "END_VAL", "CHG", "PERIOD"]]
这个结果可以直接按周期做分组统计,不需要额外做日期区间匹配。
内容的提问来源于stack exchange,提问作者Moritz Bruckner
相关产品推荐
相关产品推荐

