簡體   English   中英

將周數轉換為日期

[英]Convert week number to date

我在 R 中有一個數據框,我想將其轉換為日期。 我知道我必須選擇一周中的一年和一天,所以我將這些值固定為 2014 和 1。將其轉換為日期似乎很簡單:

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

但此代碼僅在周大於 9 時有效。第 1 - 9 周返回 NA。 如果我將周更改為 01,02,03...它仍然返回 NA。

有人看到我缺少什么嗎?

as.Date將 1 到 9 稱為 NA,因為它期望周數為兩位數,並且無法正確解析它。

要修復它,請添加一些 - 將事情分開:

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

另一種解決方案是使用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)
  • 等等。

另一種選擇是確保周數有兩位數,這可以使用stringr::str_pad()來完成,這將添加一個pad="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 年 4 月 19 日創建

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")
  }

}

lubridate另一種選擇

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM