벡터

Sep 19 2020

1 년에 한 열이 있고 율리우스 일에 다른 열이있는 데이터 프레임이 있습니다 (연도에 따라 1-366, 1-365). 윤년을 설명하기 위해 연도를 기준으로 DOY_start 열을 날짜로 효과적으로 설정하는 방법을 알고 싶었습니다.

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 패키지 (v0.3.0)에 의해 2020-09-18에 생성됨

답변

3 DirkEddelbuettel Sep 19 2020 at 05:55

흥미로운 퍼즐입니다. 우리는 그것이 as.POSIXlt연중 일 수를 포함하고 일부 날짜 라이브러리가 그것을 변환한다는 것을 알고 있지만 그것을 처리하는 파서를 즉시 찾을 수는 없습니다.

다시 말하지만, 날짜 산술 만 있으면됩니다. 우리는 항상 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 외에는 아무것도 필요하지 않습니다.