将日历周转换为每日日期
convert calendar weeks into daily dates
我得到了一个包含两列的列表,2015 年的日历周和一个值:
calender week Value
KW 1 14000
KW 2 24000
很遗憾,我收到的文件中没有更多信息。不过,我需要分析的是每日时间序列,因此我需要将 KW 1 等转换为具有相应日期的列(注意:日历周总是从星期一开始!):
calender week date Value
KW 1 29-12-13 2000
KW 1 30-12-13 2000
KW 1 31-12-13 2000
KW 1 01-01-14 2000
KW 1 02-01-14 2000
KW 1 03-01-14 2000
KW 1 04-01-14 2000
KW 2 05-01-14 3000
KW 2 06-01-14 3000
KW 2 07-01-14 3000
KW 2 08-01-14 3000
KW 2 09-01-14 3000
KW 2 10-01-14 3000
KW 2 11-01-14 3000
并且该值简单地除以 7(= 日历周中的天数)。
拜托,有人可以帮助我吗?
lubridate
包可以帮助您。它提供了轻松操作日期的功能。
在你的例子中年份似乎没有变化,所以我假设所有日期都是 2014 年(或 2013 年的最后几天,因为第 1 周从 12 月 30 日开始)。如果你不熟悉lubridate
,下面会有很多你不知道的功能。使用 ?
获取有关它们的帮助(例如 ?ymd
)。
第一步是获取一年中第一周的星期一。当然可以查,但是可以用lubridate
来计算:
library(lubridate)
start_date <- ymd("20140201")
week(start_date) <- 1
wday(start_date) <- "Monday"
start_date
## [1] "2013-12-30 UTC"
这首先选择 2014 年的任意一天,然后将星期设置为 1,将工作日设置为星期一。现在我可以通过添加适当的周数来获得任何日历周的第一天:
start_date + weeks(2)
## [1] "2014-01-13 UTC"
现在我创建了一个三周的示例数据集:
data <- data.frame(week = paste("KW", 1:3), value = c(14000, 21000, 28000))
data
## week value
## 1 KW 1 14000
## 2 KW 2 21000
## 3 KW 3 28000
转换为所需格式的过程如下:
weeks <- rep(data$week, each = 7)
weeks_num = as.numeric(gsub("KW *", "", weeks))
intervals <- weeks(weeks_num - 1) + days(0:6)
dates <- as.Date(start_date + intervals)
values <- rep(data$value, each = 7)/7
new_data <- data.frame(week = weeks, date = dates, value = values)
new_data
## week date value
## 1 KW 1 2013-12-30 2000
## 2 KW 1 2013-12-31 2000
## 3 KW 1 2014-01-01 2000
## 4 KW 1 2014-01-02 2000
## 5 KW 1 2014-01-03 2000
## 6 KW 1 2014-01-04 2000
## 7 KW 1 2014-01-05 2000
## 8 KW 2 2014-01-06 3000
## 9 KW 2 2014-01-07 3000
## 10 KW 2 2014-01-08 3000
## 11 KW 2 2014-01-09 3000
## 12 KW 2 2014-01-10 3000
## 13 KW 2 2014-01-11 3000
## 14 KW 2 2014-01-12 3000
## 15 KW 3 2014-01-13 4000
## 16 KW 3 2014-01-14 4000
## 17 KW 3 2014-01-15 4000
## 18 KW 3 2014-01-16 4000
## 19 KW 3 2014-01-17 4000
## 20 KW 3 2014-01-18 4000
## 21 KW 3 2014-01-19 4000
其工作原理如下:
首先我准备好日期。每个日历周重复七次(每天一次)。然后删除 "KW " 部分并将周数转换为数字。之后,我使用 lubridate
函数 weeks()
和 days()
来构造自 start_date
.
以来所有需要的时间间隔
我计算值。他们中的每一个也在一周的每一天重复并除以七。
最后,我将结果放入一个新的数据框中。
最后一句话:这是一个复杂的解决方案。如果您确定不会遗漏任何一周,则更容易简单地生成一系列日期,甚至不考虑日历周的列,如下所示:
dates <- as.Date(start_date + days(0:(7*nrow(data) - 1)))
identical(new_data$date, dates)
## [1] TRUE
所以我在这里简单地用 nrows()
计算周数,然后用 days()
生成一系列时间间隔,然后将其添加到 start_date
。
但是,如果可能缺少日历周,您应该使用上面更通用的解决方案。
我得到了一个包含两列的列表,2015 年的日历周和一个值:
calender week Value
KW 1 14000
KW 2 24000
很遗憾,我收到的文件中没有更多信息。不过,我需要分析的是每日时间序列,因此我需要将 KW 1 等转换为具有相应日期的列(注意:日历周总是从星期一开始!):
calender week date Value
KW 1 29-12-13 2000
KW 1 30-12-13 2000
KW 1 31-12-13 2000
KW 1 01-01-14 2000
KW 1 02-01-14 2000
KW 1 03-01-14 2000
KW 1 04-01-14 2000
KW 2 05-01-14 3000
KW 2 06-01-14 3000
KW 2 07-01-14 3000
KW 2 08-01-14 3000
KW 2 09-01-14 3000
KW 2 10-01-14 3000
KW 2 11-01-14 3000
并且该值简单地除以 7(= 日历周中的天数)。
拜托,有人可以帮助我吗?
lubridate
包可以帮助您。它提供了轻松操作日期的功能。
在你的例子中年份似乎没有变化,所以我假设所有日期都是 2014 年(或 2013 年的最后几天,因为第 1 周从 12 月 30 日开始)。如果你不熟悉lubridate
,下面会有很多你不知道的功能。使用 ?
获取有关它们的帮助(例如 ?ymd
)。
第一步是获取一年中第一周的星期一。当然可以查,但是可以用lubridate
来计算:
library(lubridate)
start_date <- ymd("20140201")
week(start_date) <- 1
wday(start_date) <- "Monday"
start_date
## [1] "2013-12-30 UTC"
这首先选择 2014 年的任意一天,然后将星期设置为 1,将工作日设置为星期一。现在我可以通过添加适当的周数来获得任何日历周的第一天:
start_date + weeks(2)
## [1] "2014-01-13 UTC"
现在我创建了一个三周的示例数据集:
data <- data.frame(week = paste("KW", 1:3), value = c(14000, 21000, 28000))
data
## week value
## 1 KW 1 14000
## 2 KW 2 21000
## 3 KW 3 28000
转换为所需格式的过程如下:
weeks <- rep(data$week, each = 7)
weeks_num = as.numeric(gsub("KW *", "", weeks))
intervals <- weeks(weeks_num - 1) + days(0:6)
dates <- as.Date(start_date + intervals)
values <- rep(data$value, each = 7)/7
new_data <- data.frame(week = weeks, date = dates, value = values)
new_data
## week date value
## 1 KW 1 2013-12-30 2000
## 2 KW 1 2013-12-31 2000
## 3 KW 1 2014-01-01 2000
## 4 KW 1 2014-01-02 2000
## 5 KW 1 2014-01-03 2000
## 6 KW 1 2014-01-04 2000
## 7 KW 1 2014-01-05 2000
## 8 KW 2 2014-01-06 3000
## 9 KW 2 2014-01-07 3000
## 10 KW 2 2014-01-08 3000
## 11 KW 2 2014-01-09 3000
## 12 KW 2 2014-01-10 3000
## 13 KW 2 2014-01-11 3000
## 14 KW 2 2014-01-12 3000
## 15 KW 3 2014-01-13 4000
## 16 KW 3 2014-01-14 4000
## 17 KW 3 2014-01-15 4000
## 18 KW 3 2014-01-16 4000
## 19 KW 3 2014-01-17 4000
## 20 KW 3 2014-01-18 4000
## 21 KW 3 2014-01-19 4000
其工作原理如下:
首先我准备好日期。每个日历周重复七次(每天一次)。然后删除 "KW " 部分并将周数转换为数字。之后,我使用
lubridate
函数weeks()
和days()
来构造自start_date
. 以来所有需要的时间间隔
我计算值。他们中的每一个也在一周的每一天重复并除以七。
最后,我将结果放入一个新的数据框中。
最后一句话:这是一个复杂的解决方案。如果您确定不会遗漏任何一周,则更容易简单地生成一系列日期,甚至不考虑日历周的列,如下所示:
dates <- as.Date(start_date + days(0:(7*nrow(data) - 1)))
identical(new_data$date, dates)
## [1] TRUE
所以我在这里简单地用 nrows()
计算周数,然后用 days()
生成一系列时间间隔,然后将其添加到 start_date
。
但是,如果可能缺少日历周,您应该使用上面更通用的解决方案。