这是我想出的。我不知道这段代码是否总是有效,但它似乎适用于我使用的示例数据集。该代码似乎可以处理 >2 年和一年中的任何一天。
该代码无法处理没有数据的年份,但如果年份不在数据集中,那么无论如何都可能无法识别这样的差距。
另请注意,如果这两个日期来自连续两年,则此方法将因以下两个日期而失败:“1/30”和“3/1”。那是因为两个日期之间的差距如此之长,以至于计算机无法意识到这两个日期不是来自同一年。
换句话说,如果两个连续日期之间有很长的间隔,任何方法都可能在没有额外信息的情况下失败。例如,如果每个季度或半年至少有一个日期,那么我认为两个发布的答案都会起作用,因为计算机将能够识别出连续几个月的减少表示新的一年。
如果两个连续日期之间的最长间隔是 11 个月,那么这两种方法都可能会起作用。如果将代码修改为同时检查两个连续日期中的每个日期的月份日期,那么 363 天的间隔可能是可以的。
# specify the initial year and create dates from the data
initial.year = 2010
date <- c("12/30", "1/1", "6/1", "6/1", "10/25", "11/27", "12/28",
"1/16", "2/17", "2/17", "2/17")
DDD3 <- as.Date(date, format="%m/%d")
# deconstruct dates into month, day and erroneous year
dtstr <- as.character(DDD3)
month <- as.numeric(as.character(sapply(strsplit(dtstr, "-") , "[", 2)))
day <- as.numeric(as.character(sapply(strsplit(dtstr, "-") , "[", 3)))
year <- as.numeric(as.character(sapply(strsplit(dtstr, "-") , "[", 1)))
DDD4 <- data.frame(month, day, year)
# obtain correct year for each date
year2=rep(NA, nrow(DDD4))
year2[1] = initial.year
for(i in 2:length(year2)) {
if(DDD4[i,1] < DDD4[(i-1),1]) (year2[i] = year2[(i-1)]+1)
if(DDD4[i,1] >= DDD4[(i-1),1]) (year2[i] = year2[(i-1)])
}
# create new dates using correct year
day2 <- sprintf("%02d", day)
month2 <- sprintf("%02d", month)
year2 <- as.character(year2)
DDD5 <- data.frame(month2, day2, year2)
DDD6 <- paste(DDD5[,1], DDD5[,2], DDD5[,3], sep='/')
DDD7 <- as.Date(DDD6, "%m/%d/%Y")
DDD7
# [1] "2010-12-30" "2011-01-01" "2011-06-01" "2011-06-01"
# "2011-10-25" "2011-11-27" "2011-12-28" "2012-01-16"
# "2012-02-17" "2012-02-17" "2012-02-17"