将 Year/Week 转换为时间戳 (dd/mm/yyyy)
Convert Year/Week to Timestamp (dd/mm/yyyy)
我有一个如下所示的数据集:
Year
Week
Cases
2010
1
2
2010
4
3
2010
5
5
2010
6
1
我想将年-周列转换为单个时间戳列 (dd/mm/yyyy)。星期几可以是第一天或最后一天。
有没有简单的方法可以解决这个问题?
最好的,
丹尼尔
如果您将第 1 周算作从 1 月 1 日开始,您可以:
as.Date(paste(df$Year, 1, 1, sep = '-')) + 7 * (df$Week - 1)
#> [1] "2010-01-01" "2010-01-22" "2010-01-29" "2010-02-05"
如果您将第 1 周算作一年中的第一个星期一开始(根据 ISO 8601),那么您可以使用这个小函数:
year_week <- function(year, week) {
as.Date(unlist((Map(function(y, w) {
d <- which(lubridate::wday(as.Date(paste(y, 1, 1:7, sep = '-'))) == 2)
as.Date(paste(y, 1, d, sep = '-')) + (w - 1) * 7}, y = year, w = week))),
origin = '1970-01-01')
}
这将为您提供一年中第第个星期一的日期,因此我们有:
year_week(df$Year, df$Week)
#> [1] "2010-01-04" "2010-01-25" "2010-02-01" "2010-02-08"
lubridate 中的 weeks 函数和 stringr 中的 str_c 函数可能会提供它:
df <- tribble(~year, ~week, 2010,1,2010,4,2010,5,2010,6)
df_tbl <- df %>%
mutate(beg = ymd(str_c(year, "-01-01")),
date_var = beg + weeks(week))
df_tbl$date_var
我有一个如下所示的数据集:
Year | Week | Cases |
---|---|---|
2010 | 1 | 2 |
2010 | 4 | 3 |
2010 | 5 | 5 |
2010 | 6 | 1 |
我想将年-周列转换为单个时间戳列 (dd/mm/yyyy)。星期几可以是第一天或最后一天。
有没有简单的方法可以解决这个问题?
最好的, 丹尼尔
如果您将第 1 周算作从 1 月 1 日开始,您可以:
as.Date(paste(df$Year, 1, 1, sep = '-')) + 7 * (df$Week - 1)
#> [1] "2010-01-01" "2010-01-22" "2010-01-29" "2010-02-05"
如果您将第 1 周算作一年中的第一个星期一开始(根据 ISO 8601),那么您可以使用这个小函数:
year_week <- function(year, week) {
as.Date(unlist((Map(function(y, w) {
d <- which(lubridate::wday(as.Date(paste(y, 1, 1:7, sep = '-'))) == 2)
as.Date(paste(y, 1, d, sep = '-')) + (w - 1) * 7}, y = year, w = week))),
origin = '1970-01-01')
}
这将为您提供一年中第第个星期一的日期,因此我们有:
year_week(df$Year, df$Week)
#> [1] "2010-01-04" "2010-01-25" "2010-02-01" "2010-02-08"
lubridate 中的 weeks 函数和 stringr 中的 str_c 函数可能会提供它:
df <- tribble(~year, ~week, 2010,1,2010,4,2010,5,2010,6)
df_tbl <- df %>%
mutate(beg = ymd(str_c(year, "-01-01")),
date_var = beg + weeks(week))
df_tbl$date_var