如何自动为时间序列数据中的每一天创建一个子集
Posted
技术标签:
【中文标题】如何自动为时间序列数据中的每一天创建一个子集【英文标题】:How to create a subset for each day in time series data automatically 【发布时间】:2021-12-27 14:48:49 【问题描述】:我已从传感器收集数据,需要自动将数据拆分为 1 天数据帧。
这是我的数据的样子:
2 2021-10-20 20:17:14 151 -135.9 8.304 -339.5 8.175 23.13232 78.95514 97.10153
3 2021-10-20 20:27:15 152 -136.9 8.302 -340.6 8.175 23.89337 86.71063 98.07861
4 2021-10-20 20:37:15 153 -138.2 8.302 -340.5 8.177 23.00682 80.71004 96.15726
5 2021-10-20 20:47:16 154 -138.8 8.302 -341.0 8.176 23.76786 83.38557 98.30032
我使用 tibbletime 和 dplyr 来获取一个 tbl_time 对象。
到目前为止,我能够为第 1 天创建一个子集,并且手动为第 2 天和第 3 天等创建子集很容易。最后我将拥有一年的数据,所以这将是一个痛苦一个手动做。
这是我使用的代码行:
day1<- filter_time(bio2_table, time_formula = '2021-10-20' ~ '2021-10-20')
我是一个菜鸟,但我仍然想相信有一种方法可以让 r 自己完成所有工作。
谢谢!
【问题讨论】:
读取 this to create a reproducible example 并获得预期输出。 【参考方案1】:你的日期对象是什么数据类型?
第一步是获取正确的日期格式,然后可以通过group_split() 得到一个数据框列表,每个数据框代表一个特定的日期。
如果对这种方法感兴趣,您可以查看 setNames() 函数来命名每个数据框。
data %>%
mutate(date = as.Date(format(date, "%y-%m-%d")))%>%
group_split(date)
【讨论】:
devtools 包中的 as_tbl_time 函数返回一个 POSIXct 日期时间对象【参考方案2】:这会返回一个带有向量作为分组数据的数据框:
t(aggregate( dat[,-2], by=list(dat$V2), list ))
[,1] [,2] [,3]
Group.1 "2021-10-20" "2021-10-21" "2021-10-22"
V1 Integer,4 6 7
V3 Character,4 "20:47:16" "20:47:16"
V4 Integer,4 155 156
V5 Numeric,4 -135.8 -131.8
V6 Numeric,4 8.306 10.302
V7 Numeric,4 -339 -347
V8 Numeric,4 8.166 8.187
V9 Numeric,4 25.76789 15.76786
V10 Numeric,4 91.38557 87.38557
V11 Numeric,4 102.3003 111.3003
# OR
aggregate( dat[,-2], by=list(dat$V2), list )
Group.1 V1 V3
1 2021-10-20 2, 3, 4, 5 20:17:14, 20:27:15, 20:37:15, 20:47:16
2 2021-10-21 6 20:47:16
3 2021-10-22 7 20:47:16
V4 V5 V6
1 151, 152, 153, 154 -135.9, -136.9, -138.2, -138.8 8.304, 8.302, 8.302, 8.302
2 155 -135.8 8.306
3 156 -131.8 10.302
V7 V8
1 -339.5, -340.6, -340.5, -341.0 8.175, 8.175, 8.177, 8.176
2 -339 8.166
3 -347 8.187
V9 V10
1 23.13232, 23.89337, 23.00682, 23.76786 78.95514, 86.71063, 80.71004, 83.38557
2 25.76789 91.38557
3 15.76786 87.38557
V11
1 97.10153, 98.07861, 96.15726, 98.30032
2 102.3003
3 111.3003
数据
dat <- structure(list(V1 = 2:7, V2 = c("2021-10-20", "2021-10-20", "2021-10-20",
"2021-10-20", "2021-10-21", "2021-10-22"), V3 = c("20:17:14",
"20:27:15", "20:37:15", "20:47:16", "20:47:16", "20:47:16"),
V4 = 151:156, V5 = c(-135.9, -136.9, -138.2, -138.8, -135.8,
-131.8), V6 = c(8.304, 8.302, 8.302, 8.302, 8.306, 10.302
), V7 = c(-339.5, -340.6, -340.5, -341, -339, -347), V8 = c(8.175,
8.175, 8.177, 8.176, 8.166, 8.187), V9 = c(23.13232, 23.89337,
23.00682, 23.76786, 25.76789, 15.76786), V10 = c(78.95514,
86.71063, 80.71004, 83.38557, 91.38557, 87.38557), V11 = c(97.10153,
98.07861, 96.15726, 98.30032, 102.30032, 111.30032)), class = "data.frame", row.names = c(NA,
-6L))
dat
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1 2 2021-10-20 20:17:14 151 -135.9 8.304 -339.5 8.175 23.13232 78.95514
2 3 2021-10-20 20:27:15 152 -136.9 8.302 -340.6 8.175 23.89337 86.71063
3 4 2021-10-20 20:37:15 153 -138.2 8.302 -340.5 8.177 23.00682 80.71004
4 5 2021-10-20 20:47:16 154 -138.8 8.302 -341.0 8.176 23.76786 83.38557
5 6 2021-10-21 20:47:16 155 -135.8 8.306 -339.0 8.166 25.76789 91.38557
6 7 2021-10-22 20:47:16 156 -131.8 10.302 -347.0 8.187 15.76786 87.38557
V11
1 97.10153
2 98.07861
3 96.15726
4 98.30032
5 102.30032
6 111.30032
【讨论】:
以上是关于如何自动为时间序列数据中的每一天创建一个子集的主要内容,如果未能解决你的问题,请参考以下文章