首先,一个可重复的例子。我正在使用data.table,因为我正在处理大约2000万行 -
> require(data.table)
> x <- structure(list(DoM = c(2011241L, 2015359L, 2016352L, 2015360L,
2015287L, 2014038L, 2017066L, 2012227L, 2015041L, 2015295L),
Year = c(2011L, 2015L, 2016L, 2015L, 2015L, 2014L, 2017L,
2012L, 2015L, 2015L), Month = c(8L, 12L, 12L, 12L, 10L, 2L,
3L, 8L, 2L, 10L)), .Names = c("DoM", "Year", "Month"), row.names = c(NA,
-10L), class = c("data.table", "data.frame"))
> x
DoM Year Month
1: 2011241 2011 8
2: 2015359 2015 12
3: 2016352 2016 12
4: 2015360 2015 12
5: 2015287 2015 10
6: 2014038 2014 2
7: 2017066 2017 3
8: 2012227 2012 8
9: 2015041 2015 2
10: 2015295 2015 10
我需要从DoM列中提取日期,该列包含类似Julian格式的日期。 DoM列的每个元素的格式为yyyyddd
,其中ddd
是一年中的某一天yyyy
(因此1 <= ddd <= 366
)。
例如:第一个日期是2011-08-29
,因为它对应于2011
我目前对我所拥有的东西不满意,这是 -
x[, Date:=as.Date((DoM-1000*Year)-1, origin=paste(Year,1,1,sep='-'))]
我怀疑paste
效率低下,正在寻找可能更好的替代品。
谢谢!
答案 0 :(得分:4)
基本格式化可以实现。见?strptime
:
as.Date(as.character(x$DoM), format="%Y%j")
# or as @Frank suggests, for integer dates in data.table:
as.IDate(as.character(x$DoM), format="%Y%j")
# [1] "2011-08-29" "2015-12-25" "2016-12-17" "2015-12-26" "2015-10-14"
# [6] "2014-02-07" "2017-03-07" "2012-08-14" "2015-02-10" "2015-10-22"