【问题标题】:Convert Julian date to calendar date将儒略日期转换为日历日期
【发布时间】:2017-08-23 23:39:26
【问题描述】:

首先,一个可重现的例子。我正在使用 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 &lt;= ddd &lt;= 366)。

例如第一个日期是2011-08-29,因为它对应于2011的第241st

我目前对我所拥有的并不满意,那就是-

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

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

【问题讨论】:

    标签: r performance data.table


    【解决方案1】:

    这可以通过基本格式来实现。见?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"
    

    【讨论】:

    • 或者对于可能更快使用的整数日期,as.IDate(same_code)
    猜你喜欢
    • 2013-07-21
    • 2011-03-02
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多