我知道我可以使用以下内容将年周数字转换为日期
week = "2018-23"
as.Date(paste(week, "1", sep = "-"), '%Y-%W-%u')
[1] "2018-06-04"
但是,如果我在2014年1月1日这样的年初接近,我会得到NA
。
week = "2014-00"
as.Date(paste(week, "1", sep = "-"), '%Y-%W-%u')
[1] NA
我意识到这是因为2014年1月1日降到了星期三,所以该周没有“第一天”,因此我需要更改其工作的天数,但它仍不返回我的日期想要。
as.Date(paste(week, "3", sep = "-"), '%Y-%W-%u')
[1] '2014-01-01'
我想获取整周的第一个日期,即返回“ 2013-12-30”。我有什么办法可以完成此操作,因为我想避免手动编辑该实例的数据很多年。
我想像lubridate::floor_date
有什么问题,但我并不总是知道星期几应该是什么。
答案 0 :(得分:2)
我无法复制您的NA
。
当我将周设置为0或1来运行您的示例时,会得到以下提示:
as.Date("2014-00-1", "%Y-%W-%u")
[1] "2014-01-06"
as.Date("2014-01-1", "%Y-%W-%u")
[1] "2014-01-06"
这让我认为第0周的解决方案是减去7:
as.Date("2014-00-1", "%Y-%W-%u") - 7
[1] "2013-12-30"
在阅读as.Date
的文档后,由于“特定于语言环境的转换”,因此您和我的行为可能会有所不同。无论如何,您都可以编写自己的函数来处理周-0:
myfun <- function(year, week) {
if (week == 0) {
as.Date(paste(year, "01", "1", sep="-"), "%Y-%W-%u") - 7
} else {
as.Date(paste(year, week, "1", sep="-"), "%Y-%W-%u")
}
}