将周数转换为日期

时间:2015-09-09 03:24:02

标签: r as.date

我在R中有一个数据框,我希望将其转换为日期。我知道我必须选择一周中的一年和一天所以我在2014年和1日修复这些值。将其转换为日期似乎很简单:

as.Date(paste(2014,df$Week,1,sep=""),"%Y%U%u")

但是这段代码仅在周大于9时才有效。第1周 - 第9周返回NA。如果我将周更改为01,02,03 ......它仍会返回NA。

任何人都能看到我错过的东西吗?

5 个答案:

答案 0 :(得分:16)

as.Date将1到9称为NA,因为它预计周数为两位数,无法正确解析它。

要修复它,添加一些 - 分解:

as.Date(paste(2014, df$Week, 1, sep="-"), "%Y-%U-%u")

答案 1 :(得分:6)

另一种解决方案是使用lubridate包中的日期算法:

lubridate::ymd( "2014-01-01" ) + lubridate::weeks( df$Week - 1 )

-1是必要的,因为2014-01-01已经是第1周了。换句话说,我们想要:

  • df$Week == 1要映射到2014-01-01ymd("2014-01-01") + weeks(1-1)
  • df$Week == 2要映射到2014-01-08ymd("2014-01-01") + weeks(2-1)
  • 等等。

答案 2 :(得分:0)

It will be like using 2nd year = (week-52), 3rd year  = (week -104)...so on

for(i in 1:456548)
{
  if (train[i,2] > 0 & train[i,2] <53)
  {
    train["weekdate"] <- as.Date(paste(2016, train$week, 1, sep="-"), "%Y-%U-%u")
  }
  if (train[i,2] > 52 & train[i,2] <105)
  {
    train["weekdate"] <- as.Date(paste(2017, (train$week-52), 1, sep="-"), "%Y-%U-%u")
  }
  if (train[i,2] > 104 & train[i,2] <150)
  {
    train["weekdate"] <- as.Date(paste(2018, (train$week-104), 1, sep="-"), "%Y-%U-%u")
  }

}

答案 3 :(得分:0)

另一种选择是确保周数有两位数字,这可以使用 stringr::str_pad() 来完成,这将添加一个 pad="0" 以确保有 pad="0" 位:

year <- 2015
week <- 1
as.Date(paste(year, week, "1", sep=""), "%Y%U%u")
#> [1] NA
as.Date(paste(year, stringr::str_pad(week,width=2, pad="0"), "1", sep=""), "%Y%U%u")
#> [1] "2015-01-05"
as.Date(paste(year, week, "1", sep="-"), "%Y-%U-%u")
#> [1] "2015-01-05"

reprex package (v1.0.0) 于 2021 年 4 月 19 日创建

答案 4 :(得分:-1)

带有lubridate的另一个选项

lubridate::parse_date_time(paste(2014, df$Week, 'Mon', sep="/"),'Y/W/a')