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

如何利用Pandas DataFrame双时间列标记重排索引后的行?

解决基于Pandas双时间列的索引重排与行标记问题

看起来你需要基于DataFrame里的两个时间列(Peak和Trough)构建一个覆盖完整时间范围的连续索引,同时用这两个时间点来标记每行的状态。我来一步步帮你实现这个需求,效率拉满~

步骤1:数据预处理(补全你的代码)

首先确保时间列处理正确,先把数据加载并转换格式:

import pandas as pd

# 加载数据
df = pd.read_csv("NBER_chronology.csv")
# 转换为datetime格式,兼容可能的空值
df["Peak month"] = pd.to_datetime(df["Peak month"], errors='coerce')
df["Trough month"] = pd.to_datetime(df["Trough month"], errors='coerce')
# 过滤掉无效的时间行
df = df.dropna(subset=["Peak month", "Trough month"])

步骤2:生成覆盖全范围的连续时间索引

我们要从最早的时间点到最晚的时间点,生成连续的月份序列作为新DataFrame的索引:

# 获取总时间范围的起始和结束点
start_date = df[["Peak month", "Trough month"]].min().min()
end_date = df[["Peak month", "Trough month"]].max().max()

# 生成按月频率的连续时间序列('MS'表示每月第一天,适配原数据的月份粒度)
time_index = pd.date_range(start=start_date, end=end_date, freq='MS')

# 创建空的新DataFrame
new_df = pd.DataFrame(index=time_index)

步骤3:用原时间列标记新DataFrame的行

接下来给新DataFrame添加标记列,比如标记是否是Peak、是否是Trough,以及是否处于衰退期(Peak到Trough之间的时间段):

# 标记Peak和Trough行
new_df['is_peak'] = new_df.index.isin(df["Peak month"])
new_df['is_trough'] = new_df.index.isin(df["Trough month"])

# 标记衰退期(基础循环版,适合小数据量)
new_df['in_recession'] = False
for _, row in df.iterrows():
    peak = row["Peak month"]
    trough = row["Trough month"]
    new_df.loc[peak:trough, 'in_recession'] = True

优化小技巧:避免循环提升效率

如果你的数据量较大,循环会拖慢速度,咱们用pd.IntervalIndex来优化:

# 创建衰退期的区间索引
recession_intervals = pd.IntervalIndex.from_arrays(df["Peak month"], df["Trough month"], closed='both')
# 快速判断每个时间点是否在任何衰退区间内
new_df['in_recession'] = new_df.index.to_series().apply(lambda x: any(x in interval for interval in recession_intervals))

处理完成后,new_df就拥有了覆盖完整时间范围的连续索引,同时清晰标记了Peak、Trough以及衰退期的行。你可以根据需求调整标记逻辑,比如添加更多状态列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:08:00