r-儒略日到日期矢量

  • 本文关键字:日期 r julian-date
  • 更新时间 :
  • 英文 :


我有一个数据帧,其中一列表示年份,另一列表示儒略日(1-366,1-365取决于年份(。我想知道如何有效地将DOY_start列设置为基于年份的.Date(以说明闰年(。

我尝试使用as.Date((、as.POSIXct((、lubridate::as_Date((

但我所有的试验都失败了。下面是一个代码示例,其中生成的数据与我原来的数据非常相似。

非常感谢你的建议。

library(tibble)
Year <- 1980:2020
DOY_start <- as.integer(rnorm(length(Year), mean=91.1, sd=9.65))
var <- cbind(Year, DOY_start)
var <- as_tibble(var) 
head(var)
#> # A tibble: 6 x 2
#>    Year DOY_start
#>   <int>     <int>
#> 1  1980        98
#> 2  1981        89
#> 3  1982        79
#> 4  1983        97
#> 5  1984        81
#> 6  1985        80
var$DOY_start_date <- as.POSIXct(strptime(var$DOY_start, "%j"))
head(var)
#> # A tibble: 6 x 3
#>    Year DOY_start DOY_start_date     
#>   <int>     <int> <dttm>             
#> 1  1980        98 2020-04-07 00:00:00
#> 2  1981        89 2020-03-29 00:00:00
#> 3  1982        79 2020-03-19 00:00:00
#> 4  1983        97 2020-04-06 00:00:00
#> 5  1984        81 2020-03-21 00:00:00
#> 6  1985        80 2020-03-20 00:00:00

由reprex包于2020-09-18创建(v0.3.0(

这是一个有趣的谜题。我们知道as.POSIXlt包含一年中的某一天的数字,并且一些日期库会转换为它,但我无法立即找到处理它的解析器

再说一遍,日期算术就是我们所需要的。我们总是把日期定在1月1日。然后,所需的日期就是1月1日加上"一年中的某一天"数字减去1。

密码
yearyearday <- function(yr, yd) {
base <- as.Date(paste0(yr, "-01-01")) # take Jan 1 of year
day <- base + yd - 1
}
set.seed(42)  # make it reproducible
sample <- data.frame(year=1980:2020, doy=as.integer(rnorm(41,mean=91.1,sd=9.65)))
sample$date <- yearyearday(sample$year, sample$doy)
head(sample)
输出
R> yearyearday <- function(yr, yd) {
+     base <- as.Date(paste0(yr, "-01-01")) # take Jan 1 of year
+     day <- base + yd - 1
+ }
R> 
R> set.seed(42)  # make it reproducible
R> sample <- data.frame(year=1980:2020, 
+                       doy=as.integer(rnorm(41, mean=91.1, sd=9.65)))
R> 
R> sample$date <- yearyearday(sample$year, sample$doy)
R> 
R> head(sample)
year doy       date
1 1980 104 1980-04-13
2 1981  85 1981-03-26
3 1982  94 1982-04-04
4 1983  97 1983-04-07
5 1984  95 1984-04-04
6 1985  90 1985-03-31
R> 

和通常的日期计算一样,除了基数R之外,什么都不需要。

最新更新