23

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

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

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

有人看到我错过了什么吗?

4

5 回答 5

40

as.Date将 1 到 9 称为 NA,因为它需要两位数的周数并且无法正确解析它。

要修复它,请添加一些 - 以拆分:

as.Date(paste(2014, df$Week, 1, sep="-"), "%Y-%U-%u")
于 2015-09-09T03:27:22.280 回答
14

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

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

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

  • df$Week == 1映射到2014-01-01(即ymd("2014-01-01") + weeks(1-1)
  • df$Week == 2映射到2014-01-08(即ymd("2014-01-01") + weeks(2-1)
  • 等等。
于 2017-09-12T18:43:14.873 回答
2

另一种选择lubridate

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

W - 周数,w - 工作日数,0-6(周日至周六)

于 2020-01-27T13:09:51.647 回答
2

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

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 包(v1.0.0)于 2021-04-19 创建

于 2021-04-19T22:25:30.743 回答
-1
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")
  }

}
于 2018-12-15T18:04:25.417 回答