在R中去除日期中的年份

22

我有20年的气象数据,但我只对每年的模式感兴趣。例如,我不关心1995年6月与2011年6月的差异。相反,我想要6月1日的20个值,6月2日的20个值等等。

我的问题:如何去掉日期对象中的年份部分,保留月份和日期,并同时保持日期的顺序属性?我的最终目标是一个长列表,其中重复的mm/dd值对应于结果变量。我将把mm/dd视为因子,但按正确的顺序排列。

# Given this:
as.Date(c("2014-06-01","1993-06-01", "2013-06-03", "1999-01-31"), "%Y-%m-%d")
# I want to get this:
"06-01" "06-01" "06-03" "01-31"
# That will sort like this
"01-31" "06-01" "06-01" "06-03"

使用sub()函数去除年份并将破折号转换为小数等类似的小技巧是不可行的,因为这样每个月的第一天就会和第十天相同。我还尝试将日期转换为字符字符串,删除年份,然后再将其转换回日期......但结果所有日期都变成2014年。


1
可能存在一些微妙之处。闰年的2月29日是在非闰年的3月1日之前、之后还是一样?您可能想使用lubridate包中的yday函数,该函数返回一年中某天的索引。lubridate中的其他功能也可能有所帮助,值得一试。 - Spacedman
有趣的是,这可能做到我需要的。不过,如果我已经有了m/d,那么闰年就无关紧要了,因为2/30将是一个独特的级别。 - Nancy
这就是为什么 data.frame 存在的原因。您可以使用 @jalapic 的答案创建一个两列的 data.frame,并使用 dplyr::arrange() 进行排序。 - NicChr
2个回答

23

这个有效吗?

temp<-as.Date(c("2014-06-01","1993-06-01", "2013-06-03", "1999-01-31"), "%Y-%m-%d")

x<-format(temp, format="%m-%d")

 x
[1] "06-01" "06-01" "06-03" "01-31"


sort(x)
[1] "01-31" "06-01" "06-01" "06-03"

8
它们似乎不再是“日期”对象了,使用as.Date也似乎行不通。有什么想法吗? - StatsSorceress

1
jalapic在我的回答之前,将日期列转换为字符向量(传递给format的对象以字符形式返回以进行漂亮的打印)。
根据OP的说法,摆脱年份的原因之一,可能是关键原因,是为了按日和月进行汇总,而不考虑年份。对我来说,这表明时间序列不是此列的正确数据类型,而是您最好使用有序因子,它将保留OP所需的“日期的顺序属性”。
这基本上就是
诚然,因素不理解日期或数字,但它确实理解唯一值,在这种情况下,至少应按照OP的要求进行操作。
> d = "2014-06-01"
> d = as.Date(d)

fnx = function(x) {
         unlist(strsplit(as.character(x), '[19|20][0-9]{2}-', fixed=FALSE))[2]
     }

> dm("2012-01-25")
    [1] "01-25"

> dm1 = sapply(column_of_date_objs, fnx)

> new_col = as.factor(dm1, ordered=TRUE)

1
我也不确定“日期的顺序属性”。在我的解决方案中,你是正确的,年份仍然被识别。sort(x)确实按照所请求的mm-dd格式返回排序结果。我理解保持顺序属性可能意味着可能要在某个时候按日期对向量进行排序。order(x)可以做到这一点...例如,在此示例中,它返回[1] 4 1 2 3。我也喜欢你的解决方案。 - jalapic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接