在r - data.table中将Julian日期转换为日历日期

时间:2017-08-23 23:39:26

标签: r performance data.table

首先,一个可重复的例子。我正在使用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

的241 st

我目前对我所拥有的东西不满意,这是 -

x[, Date:=as.Date((DoM-1000*Year)-1, origin=paste(Year,1,1,sep='-'))]

我怀疑paste效率低下,正在寻找可能更好的替代品。

谢谢!

1 个答案:

答案 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"