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

计算数据表中同列同月不同年份的数值差值(含NA处理)

嘿,这个需求太典型了——做同比分析的时候经常要这么算!我给你准备了两种主流工具的实现方案,你挑顺手的用就行:

用R实现(dplyr + lubridate)

首先得把日期拆成年份和月份,然后按月份分组,这样就能轻松找到同月份的上一年数据啦:

library(dplyr)
library(lubridate)

# 假设你的数据集叫df,日期列是`date`,数值列是`value`
df <- df %>%
  # 提取月份和年份作为临时分组依据
  mutate(month = month(date),
         year = year(date)) %>%
  # 按月份分组,这样每个组里都是同月份不同年份的数据
  group_by(month) %>%
  # 用lag函数取上一年的数值,计算差值
  mutate(year_over_year_diff = value - lag(value, order_by = year)) %>%
  # 取消分组,清理临时列(可选)
  ungroup() %>%
  select(-month, -year)

这样处理后,2000年的所有行因为没有上一年数据,year_over_year_diff会自动返回NA,完全符合你的要求。记得先确保数据是按日期升序排列的哦,如果不是的话,先加一行arrange(date)。

用Python实现(Pandas)

Pandas的分组和diff函数天生适合做这种事,步骤更简洁:

import pandas as pd

# 先确保日期列是datetime格式
df['date'] = pd.to_datetime(df['date'])

# 提取月份作为分组键
df['month'] = df['date'].dt.month

# 按月份分组后,用diff计算当前行与上一行的差值(因为数据按年份递增,正好是上年同月)
df['year_over_year_diff'] = df.groupby('month')['value'].diff()

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

同样,2000年的行因为分组后没有前序数据,差值会是NA。如果你的数据不是按日期排序的,先执行df = df.sort_values('date')再分组计算,结果才准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:06:03