简体   繁体   English

如何在R中使用lubridate将周和年列转换为日期列

[英]How to convert week and year columns to a date column with lubridate in R

I have been following along with Hadley Wickham's R for data science book. 我一直在关注Hadley Wickham的R for data science book。 He has a lot of advice on using lubridate, but a lot of the functions assume that you have year, month, and day. 他在使用lubridate方面有很多建议,但是许多功能假定您有年,月和日。 How do you convert to date format when all you have is year and week using lubridate? 当您使用lubridate时,只有年份和星期时,如何转换为日期格式?

data.frame(
    year = c(2015, 2015, 2016, 2016, 2016, 2016, 2016),
    week = c(1, 20, 35, 49, 8, 4, 53)
  )

#year   week
#2015    1
#2015    20
#2016   35  
#2016   49  
#2016   8   
#2016   4   
#2016   53

You can do this with the weeks() function in lubridate, if you want. 如果需要,可以使用lubridate中的week weeks()函数来执行此操作。 You just have to first set up a baseline date object. 您只需要首先设置一个基准日期对象。 I did that here using str_c from stringr. 我这样做,在这里使用str_c从stringr。

library(dplyr)
library(stringr)

my_dates <- tribble(
    ~year,   ~week,
    2015,    1,
    2015,    20,
    2016,    35,  
    2016,    49,  
    2016,    8,  
    2016,    4,   
    2016,    53
)

my_dates %>%
    mutate(beginning = ymd(str_c(year, "-01-01")),
           final_date = beginning + weeks(week))
#> # A tibble: 7 x 4
#>    year  week  beginning final_date
#>   <dbl> <dbl>     <date>     <date>
#> 1  2015     1 2015-01-01 2015-01-08
#> 2  2015    20 2015-01-01 2015-05-21
#> 3  2016    35 2016-01-01 2016-09-02
#> 4  2016    49 2016-01-01 2016-12-09
#> 5  2016     8 2016-01-01 2016-02-26
#> 6  2016     4 2016-01-01 2016-01-29
#> 7  2016    53 2016-01-01 2017-01-06

Arkun's answer is tidy and accurate but since you asked about using lubridate I figured I'd add my two cents. Arkun的回答很整洁而准确,但是既然您问起使用lubridate我想我会加2美分。 You want to define New Year's day for each year in question and then advance the specified number of weeks from that. 您要为相关年份定义元旦,然后从中提前指定的周数。 This makes it much easier to account for leap years (which stymied my first effort to answer this question). 这样就更容易解释leap年了(这阻碍了我为回答这个问题所做的第一努力)。

library(tidyverse)
library(lubridate)

date_week <- data.frame(
  year = c(2015, 2015, 2016, 2016, 2016, 2016, 2016, 1970),
  week = c(1, 20, 35, 49, 8, 4, 53, 1)
)

date_week %>%
  tbl_df() %>% 
  mutate(newyears = ymd(paste0(year,"-01-01"))) %>% 
  mutate(date = newyears + weeks(week))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM