R语言:为时序观测数据按每年1月递增生成Year列的技术求助
解决按"Jan"自动递增年份的问题
我完全懂你的需求啦——要给按时间顺序排列的观测生成Year列,起始年份是1963,每次遇到"Jan"就自动把年份加1,而且之前用儒略日判断的方案因为逻辑问题出现了错误(比如连续Dec的时候年份被误改)。下面给你一个精准的解决方案:
核心思路
因为你的观测是严格按时间顺序排列的,所以我们只需要统计每个观测位置之前(包括当前)出现过多少次"Jan",然后用起始年份加上「Jan出现次数-1」就可以了:
- 第一次出现"Jan":年份 = 1963 + (1-1) = 1963
- 第二次出现"Jan":年份 = 1963 + (2-1) = 1964
- 第三次出现"Jan":年份 = 1963 + (3-1) = 1965
- 以此类推,非"Jan"的观测会继承当前的年份,完全符合你的要求。
代码实现
1. 构造测试数据
先做一个更贴合你场景的测试数据(包含多次"Jan"和连续"Dec"):
df <- data.frame( day = c(24, 21, 20, 10, 20, 20, 10, 15, 5, 12, 3, 18, 10), month = c("Jun", "Mar", "Jan", "Dec", "Jun", "Jan", "Dec", "Dec", "Feb", "Nov", "Dec", "Nov", "Jan") )
2. 生成Year列
# 设定起始年份 start_year <- 1963 # 统计每行及之前出现"Jan"的累计次数 jan_cumulative <- cumsum(df$month == "Jan") # 计算对应的年份 df$Year <- start_year + (jan_cumulative - 1)
3. 查看结果
运行后df的内容如下:
day month Year 1 24 Jun 1963 2 21 Mar 1963 3 20 Jan 1963 4 10 Dec 1963 5 20 Jun 1964 6 20 Jan 1964 7 10 Dec 1964 8 15 Dec 1964 9 5 Feb 1965 10 12 Nov 1965 11 3 Dec 1965 12 18 Nov 1965 13 10 Jan 1965
可以看到:
- 第3条(第一次"Jan")年份是1963
- 第6条(第二次"Jan")年份是1964
- 第13条(第三次"Jan")年份是1965
- 连续的"Dec"观测年份完全正确,没有误改的情况。
为什么之前的方案会出错?
你参考的那个方案用儒略日的差值判断跨年,逻辑存在两个问题:
- 判断条件错误:跨年的标志应该是出现"Jan"(因为观测按时间顺序,下一个"Jan"必然是下一年),而不是儒略日的大小变化;
- 逻辑方向错误:代码里用
1963 - cumsum(...),当儒略日差值为正的时候会减去计数,导致年份反而变小(比如你提到的最后一条观测年份变成1959,明显不符合逻辑)。
我们这个方案完全规避了这些问题,直接利用观测的时间顺序和"Jan"的出现次数来计算年份,简单又准确。
内容的提问来源于stack exchange,提问作者cesco
相关产品推荐
相关产品推荐

