R 将周数转换为日期
我在R中有一个数据框,其中包含我想转换为日期的一年中的一周。我知道我必须选择一年和一周中的一天,所以我将这些值固定在2014年和1年。将其转换为日期似乎很简单: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,因为它期望周数为两位数,因此无法正确解析它 若要解决此问题,请添加一些-以拆分:
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.@Philymd(“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')