从R中的日期中删除年份

时间:2014-07-26 02:06:47

标签: r date

我有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()来删除年份并将短划线转换为小数的小麻烦并不起作用,因为那个月的第1个月与该月的第10个相同。我还尝试将日期转换为字符串,删除年份,然后将其重新设置为日期......这就是2014年的所有内容。

2 个答案:

答案 0 :(得分:21)

这有用吗?

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"

答案 1 :(得分:2)

jalapic在我之前的答案,将日期列转换为字符向量(传入格式的对象作为漂亮打印的字符返回)。

根据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)