r - 如何在 R 中扩展时间序列
问题描述
请注意,这不是其他时间序列扩展问题的重复。没有开始和结束日期,它基于一个月中的天数的值,并且月份是重复的。
假设我有以下数据集:
dates<-c("2019-01-07", "2019-02-07", "2019-03-07", "2019-01-22", "2019-02-25")
month<-c("Jan", "Feb", "March", "Jan", "Feb")
no_days_PerMonth <-c(31, 28, 31, 31, 28)
values<-c(54,89,100, 50, 6)
(test<-as.data.frame(cbind(dates, no_days_PerMonth, month, values)))
dates no_days_PerMonth month values
1 2019-01-07 31 Jan 54
2 2019-02-07 28 Feb 89
3 2019-03-07 31 March 100
4 2019-01-22 31 Jan 50
5 2019-02-25 28 Feb 6
我想做的是生成一个新的数据框,该数据框采用dates
变量月份的天数,并扩展行数以匹配该月的特定天数,并将列映射values
到每个新行。我想要以下内容:
dates no_days_PerMonth month values new_date
2019-01-07 31 Jan 54 2019-01-01
2019-01-07 31 Jan 54 2019-01-02
2019-01-07 31 Jan 54 2019-01-03
2019-01-07 31 Jan 54 2019-01-04
2019-01-07 31 Jan 54 2019-01-05
2019-01-07 31 Jan 54 2019-01-06
2019-01-07 31 Jan 54 2019-01-07
2019-01-07 31 Jan 54 2019-01-08
2019-01-07 31 Jan 54 2019-01-09
2019-01-07 31 Jan 54 2019-01-10
2019-01-07 31 Jan 54 2019-01-11
2019-01-07 31 Jan 54 .
2019-01-07 31 Jan 54 .
2019-01-07 31 Jan 54 .
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-02-07 28 Feb 89 2019-02-01
2019-02-07 28 Feb 89 2019-02-02
2019-02-07 28 Feb 89 2019-02-03
2019-02-07 28 Feb 89 2019-02-04
2019-02-07 28 Feb 89 2019-02-05
2019-02-07 28 Feb 89 2019-02-06
2019-02-07 28 Feb 89 2019-02-07
2019-02-07 28 Feb 89 2019-02-08
2019-02-07 28 Feb 89 2019-02-09
2019-02-07 28 Feb 89 2019-02-10
2019-02-07 28 Feb 89 .
2019-02-07 28 Feb 89 .
2019-02-07 28 Feb 89 .
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
“...”只是代表数据扩展的继续(我不想花时间把它全部写出来)。此外,在下面的示例数据集中,扩展仅显示在原始数据集中的前两个日期,因为我不想花时间把它全部写出来。
解决方案
这是一个data.table
加号lubridate
解决方案
library(data.table)
library(lubridate)
setDT(test)[, .(dates, no_days_PerMonth, month, values, new_date = seq(
floor_date(as.Date(dates), "month"),
floor_date(as.Date(dates), "month") %m+% days(as.numeric(as.character(no_days_PerMonth))),
by = "day")), by = dates]
# dates dates no_days_PerMonth month values new_date
#1: 2019-01-07 2019-01-07 31 Jan 54 2019-01-01
#2: 2019-01-07 2019-01-07 31 Jan 54 2019-01-02
#3: 2019-01-07 2019-01-07 31 Jan 54 2019-01-03
#4: 2019-01-07 2019-01-07 31 Jan 54 2019-01-04
#5: 2019-01-07 2019-01-07 31 Jan 54 2019-01-05
#---
#150: 2019-02-25 2019-02-25 28 Feb 6 2019-02-25
#151: 2019-02-25 2019-02-25 28 Feb 6 2019-02-26
#152: 2019-02-25 2019-02-25 28 Feb 6 2019-02-27
#153: 2019-02-25 2019-02-25 28 Feb 6 2019-02-28
#154: 2019-02-25 2019-02-25 28 Feb 6 2019-03-01
解释:我们使用floor_date
从 获取一个月的第一天,然后我们从plusdates
扩展dates
使用seq.Date
从该月的第一天到该月的第一天。dates
no_days_PerMonth
推荐阅读
- python - 如何从带有子框架的网站中抓取信息
- spring-boot - 在 IBM Liberty 服务器中安装 ojdbc8 jar 文件
- python - 无法打印一次以完全获取所有数据
- machine-learning - 需要帮助找出我在使用一个变量的线性回归的梯度下降代码中做错了什么
- android - ProgressBar 不会在代码中的任何地方加载
- android - BitmapFactory:无法解码流:java.io.FileNotFoundException:.jpg(没有这样的文件或目录)
- nginx - 当我尝试创建自定义 server_name 时,它只停留在默认的 Nginx 页面
- java - 我想制作一个随机图像生成器,但它不起作用
- c# - unity上传播放器数据文本文件到服务器,需要一些引导格式
- rust - 如何声明包含任何类型的可反序列化/可序列化结构的结构?