将周数转换为日期

Aar*_*rom 12 r as.date

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

as.Date(paste(2014,df$Week,1,sep=""),"%Y%U%u")
Run Code Online (Sandbox Code Playgroud)

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

有人看到我错过了吗?

jer*_*ycg 23

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

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

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

  • 请注意关于如何计算一周中的不同惯例.请参阅[此答案](/sf/answers/3191135111/)进行讨论. (2认同)

Art*_*lov 7

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

lubridate::ymd( "2014-01-01" ) + lubridate::weeks( df$Week - 1 )
Run Code Online (Sandbox Code Playgroud)

-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))
  • 等等.

  • 注意关于如何计算一周中的不同惯例。请参阅 [这个答案](/sf/answers/3191135111/) 进行讨论。 (2认同)

Yur*_*nko 6

另一种选择是lubridate

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

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

  • 如果“Mon”不是星期一的缩写,则区域设置可能是原因,您可以使用 1 表示星期一,使用“u”代替“a” `lubridate::parse_date_time(paste(2014, 42, 1, sep="/ "),'Y/W/u')` (3认同)
  • 我检查了一下,效果很好。你能告诉你有什么结果吗? (2认同)