如何自动为时间序列数据中的每一天创建一个子集

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

【讨论】:

以上是关于如何自动为时间序列数据中的每一天创建一个子集的主要内容,如果未能解决你的问题,请参考以下文章

blast 抗性筛选 啥意思

leetcode38 外观数列(Easy)

如何将数据框中的值分配给在另一个数据框中创建的十分位数?

枚举非空真子集

MYSQL 怎样获取指定月份的每一天,求助

ExtJS中怎样获取Form表单中的每一项的值