如何获取指定年份指定周的第一天?lubridate包实现方法
使用lubridate包将年份+周数转换为该周第一天的日期
当然可以用lubridate轻松实现这个需求!我来一步步带你完成转换,完全贴合你给出的示例数据:
1. 先搞定lubridate包的安装与加载
如果还没装过lubridate,先运行这两行命令:
install.packages("lubridate") library(lubridate)
2. 拆分输入的周数和年份
你的数据是"周数/年份"格式的字符串,我们先用基础R的strsplit()把它们拆分开:
Missing_day <- c("33/1988", "37/1991", "37/1992", "41/1994", "15/1997", "18/2001", "50/2001", "16/2002", "35/2004", "5/2012", "50/2012", "8/2013", "36/2013", "51/2017") # 拆分每个字符串,提取周数和年份 split_data <- strsplit(Missing_day, "/") week_numbers <- sapply(split_data, function(x) x[1]) years <- sapply(split_data, function(x) x[2])
3. 转换为该周第一天的日期
这里我们利用lubridate的日期解析能力,构造"年份-W周数-1"格式的字符串(-1代表周一,也就是ISO标准里一周的第一天),然后用parse_date_time()解析成日期:
# 拼接成lubridate能识别的日期字符串 date_inputs <- paste0(years, "-W", week_numbers, "-1") # 解析为日期格式 first_day_of_week <- parse_date_time(date_inputs, "%Y-W%W-%u")
4. 格式化成你要的日/月/年样式
最后用format()函数把日期转换成日/月/年的格式:
formatted_dates <- format(first_day_of_week, "%d/%m/%Y")
看看结果对不对!
运行完上面的代码后,打印结果就能看到:
print(formatted_dates)
比如第一个输入"33/1988"对应的输出就是"15/08/1988",和你给的示例完全一致~
小补充
- 如果你习惯用周日作为一周的第一天,只需要把构造字符串时的
-1改成-7,同时把解析格式里的%u换成%w(%w中周日对应0)就行。 - 要是你用tidyverse的话,还可以用管道操作简化代码,看起来更清爽:
library(tidyverse) library(lubridate) tibble(Missing_day) %>% separate(Missing_day, into = c("week", "year"), sep = "/") %>% mutate( date_str = paste0(year, "-W", week, "-1"), first_day = parse_date_time(date_str, "%Y-W%W-%u"), formatted_date = format(first_day, "%d/%m/%Y") ) %>% pull(formatted_date)
内容的提问来源于stack exchange,提问作者Ian.T
相关产品推荐
相关产品推荐

