朱利安日迄今矢量
Julian day to date vector
我有一个数据框,其中一列代表年份,另一列代表儒略日(1-366、1-365,具体取决于年份)。我想知道如何根据年份(考虑闰年)有效地设置 DOY_start 列 as.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 package (v0.3.0)
于 2020-09-18 创建
这是个有趣的谜题。我们知道 as.POSIXlt
包含年中的第几天,并且一些日期库将其转换为它,但我无法立即找到处理它的解析器。
话又说回来,我们只需要日期算术。我们总是得到 1 月 1 日的日期。所需的日期就是 1 月 1 日加上 'day-of-year' 数字减 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 之外什么都不需要。
我有一个数据框,其中一列代表年份,另一列代表儒略日(1-366、1-365,具体取决于年份)。我想知道如何根据年份(考虑闰年)有效地设置 DOY_start 列 as.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 package (v0.3.0)
于 2020-09-18 创建这是个有趣的谜题。我们知道 as.POSIXlt
包含年中的第几天,并且一些日期库将其转换为它,但我无法立即找到处理它的解析器。
话又说回来,我们只需要日期算术。我们总是得到 1 月 1 日的日期。所需的日期就是 1 月 1 日加上 'day-of-year' 数字减 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 之外什么都不需要。