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

如何在Pandas DataFrame中计算收益报告日以来的天数

计算距离最近一次收益报告日的天数

我来帮你搞定这个需求!你的目标是给DataFrame新增一列,记录每行日期距离最近一次Earnings Reported为1的天数,咱们先看看问题出在哪,再给出可行的解决方案。

先分析你原来的代码问题

你写的这段代码有两个明显的问题:

  • 语法错误:groupby['Earnings Reported']应该写成groupby('Earnings Reported')(用括号而非方括号)
  • 逻辑偏差:按Earnings Reported分组会把所有1和0分成两组,这完全不是我们需要的——我们要的是从每个收益报告日开始,到下一个报告日之前的连续行作为一组,来计算天数递增。

解决方案:两种可行方法

方法1:用分组标识+组内日期差

先把日期转成datetime类型(这一步很关键,不然没法计算天数),然后创建分组标识,最后在每个分组内计算当前日期与组内第一个日期(也就是收益报告日)的天数差:

import pandas as pd

# 构造你的原始DataFrame
data = {
    'Date': ['2018-04-02', '2018-04-03', '2018-04-04'],
    'Earnings Reported': [1, 0, 0]
}
df = pd.DataFrame(data)

# 第一步:将Date列转为datetime类型
df['Date'] = pd.to_datetime(df['Date'])

# 第二步:创建分组标识——每次出现收益报告日,分组号+1
df['group_id'] = df['Earnings Reported'].cumsum()

# 第三步:对每个分组,计算当前日期与分组首个日期的天数差
df['DaySinceEarnings'] = df.groupby('group_id')['Date'].apply(lambda x: x - x.iloc[0]).dt.days

# 可选:删除临时的group_id列
df = df.drop('group_id', axis=1)

运行后得到的结果就是你想要的:

DateEarnings ReportedDaySinceEarnings
2018-04-0210
2018-04-0301
2018-04-0402

方法2:标记最近收益报告日(更简洁)

这种方法更直观:先给每行标记出最近的收益报告日,再直接计算日期差:

import pandas as pd

# 同样先构造并处理日期列
data = {
    'Date': ['2018-04-02', '2018-04-03', '2018-04-04'],
    'Earnings Reported': [1, 0, 0]
}
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])

# 标记最近的收益报告日:仅在Earnings Reported为1时保留日期,其余用ffill向前填充
df['Last_Earnings_Date'] = df['Date'].where(df['Earnings Reported'] == 1).ffill()

# 计算天数差
df['DaySinceEarnings'] = (df['Date'] - df['Last_Earnings_Date']).dt.days

# 可选:删除临时列
df = df.drop('Last_Earnings_Date', axis=1)

这个方法不需要分组,代码更简洁,结果完全一致。

关键注意点

  • 一定要确保Date列是datetime类型,否则无法计算日期差
  • 如果你的DataFrame中有多个收益报告日(比如中间又出现1),这两种方法都会自动重置计数,完全适配多报告日的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:46:18