R 将周数转换为日期

R 将周数转换为日期,r,as.date,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 有人看到我遗漏了什么吗?as.Date将1到9调用为NA,因为它期望周数为两位数,因此无法正确解析它 若要解决此问题,请添加一些-以拆分:

我在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”)+周(1-1)
  • df$Week==2
    映射到
    2014-01-08
    (即
    ymd(“2014-01-01”)+周(2-1)
  • 等等
这就像使用第二年=(第52周),第三年=(第104周)…以此类推
(我在1:456548)
{

如果(序列[i,2]>0和序列[i,2]另一个带有
lubridate的选项

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

W-周数,W-工作日数,0-6(星期六)

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

年份[1]“2015-01-05”
截止日期(粘贴(年,周,“1”,九月=“-”,%Y-%U-%U”)
#> [1] "2015-01-05"

由(v1.0.0)创建于2021-04-19年的

r在数字数据中去掉01中的
0
-请参见
粘贴(2014,01,1,sep=“”)
-“201411”的输出。您可以执行
粘贴(2014,01,1,sep=“”)
使其成为字符,但如果您的数据是数字,这将不容易工作。请注意如何计算一年中的周数的不同约定。请参阅以进行讨论。您将如何将其概括为考虑到年份的变化?请注意如何计算一年中的周数的不同约定。请参阅以进行讨论on.@Phil
ymd(“2014-01-01”)+周数(df$Week-1)+年数(df$Year-2014)
(假设存在
年变量)。可能重复的。请注意关于如何计算一年中的周数的不同约定。请参阅以进行讨论。@U我认为最好在此处发布您的答案,并关闭另一个Q作为重复项。我检查了它,效果很好。您能告诉我您得到了什么结果吗?
[1]NA警告消息:所有格式解析失败。未找到任何格式。
Locale设置可能是原因,如果“Mon”不是周一的缩写,您可以使用1表示周一,使用“u”代替“a”。
lubridate::parse_date_time(粘贴(2014,42,1,sep=“/”,“Y/W/u”)
lubridate::parse_date_time(paste(2014, df$Week, 1, sep="/"),'Y/W/w')