【问题标题】:Using cut function on data.table for dates在 data.table 上使用 cut 函数获取日期
【发布时间】:2021-10-03 18:01:10
【问题描述】:

我正在努力找出实现目标的最佳方式。我有一个大型主数据表(> 110,000 个观察值),其中包含来自多个相机站拍摄的照片的数据。我有一个单独的 data.table 包含有关这些相机的信息,例如从它们上传照片的时间(从每个相机多次上传照片)。对于每台相机,我需要将其拍摄的照片子集到由照片上传时间定义的“箱”中。我假设我需要使用for 循环来遍历每个摄像头,但从那里我被卡住了。我觉得我正在寻找一个 cut 函数的版本,它可以将照片所属的“bin”作为 data.table 中的单独列返回。

来自一台相机的照片的示例 data.table:

> station_photos
 year_unit_station    Photo_Number   Creation_Datetime bin_name
1:       2016_275_02 275_02_0017.JPG 2016-09-23 11:51:03         
2:       2016_275_02 275_02_0035.JPG 2016-09-27 15:58:21         
3:       2016_275_02 275_02_0036.JPG 2016-09-27 15:58:49         
4:       2016_275_02 275_02_0037.JPG 2016-09-27 16:00:04         
5:       2016_275_02 275_02_0038.JPG 2016-09-27 16:00:59         
6:       2016_275_02 275_02_0039.JPG 2016-09-27 16:01:27         
7:       2016_275_02 275_02_0062.JPG 2016-10-02 12:22:35         
> 

显示照片上传时间的表格示例:

> station_bins
   year_unit_station    service_end_dttm      bin_name
1:       2016_275_02 2016-09-23 11:21:00 2016_275_02_1
2:       2016_275_02 2016-09-30 10:45:00 2016_275_02_2
3:       2016_275_02 2016-10-07 08:31:00 2016_275_02_3

我希望从我的代码中获得的每台相机的最终目标表:

> station_photos
 year_unit_station    Photo_Number   Creation_Datetime bin_name
1:       2016_275_02 275_02_0017.JPG 2016-09-23 11:51:03 2016_275_02_1        
2:       2016_275_02 275_02_0035.JPG 2016-09-27 15:58:21 2016_275_02_1        
3:       2016_275_02 275_02_0036.JPG 2016-09-27 15:58:49 2016_275_02_1        
4:       2016_275_02 275_02_0037.JPG 2016-09-27 16:00:04 2016_275_02_1       
5:       2016_275_02 275_02_0038.JPG 2016-09-27 16:00:59 2016_275_02_1        
6:       2016_275_02 275_02_0039.JPG 2016-09-27 16:01:27 2016_275_02_1        
7:       2016_275_02 275_02_0062.JPG 2016-10-02 12:22:35 2016_275_02_2
8:       2016_275_02 275_02_0075.JPG 2016-10-31 03:09:43 2016_275_02_3        
> 

我考虑过使用cut()subset,但我不确定如何为我填写“bin_name”的最后一个变量,而不仅仅是返回一个列表或data.frame。我的另一个担忧是,并非每个相机都会有 3 个 bin,有些会有 2 个,有些会有 4 个。为了增加一个转折,我如何使用类似或相同的方法来创建设定长度的 bin,而不是从一个日期范围。最终目标是统计相机在两次上传之间拍摄了多少张照片,以及计算每台相机每隔 10 分钟拍摄的照片数量。保留该 bin_name 列以供将来分析将非常有帮助。

我不确定我的解释是否有道理,我很可能使解决方案变得比我需要的更复杂。提前感谢您提供的任何帮助或见解!

【问题讨论】:

    标签: r datetime data.table lubridate


    【解决方案1】:

    也许,我误解了整个问题,但我想知道为什么上传的时间戳 bin 中照片的时间戳之前,例如 bin 2016_275_02_1 service_end_dttm是 2016-09-23 11:21:00,但该垃圾箱中的第一张照片是半小时后在 Creation_Datetime 2016-09-23 11:51:03 拍摄的。

    但是,OP 的预期结果可以通过 滚动连接通过引用更新 重现。

    library(data.table)
    station_photos[, bin_name := 
                     station_bins[station_photos, 
                                  on = c("year_unit_station", "service_end_dttm" = "Creation_Datetime"), 
                                  roll = Inf, bin_name]][]
    
       year_unit_station    Photo_Number   Creation_Datetime      bin_name
    1:       2016_275_02 275_02_0017.JPG 2016-09-23 11:51:03 2016_275_02_1
    2:       2016_275_02 275_02_0035.JPG 2016-09-27 15:58:21 2016_275_02_1
    3:       2016_275_02 275_02_0036.JPG 2016-09-27 15:58:49 2016_275_02_1
    4:       2016_275_02 275_02_0037.JPG 2016-09-27 16:00:04 2016_275_02_1
    5:       2016_275_02 275_02_0038.JPG 2016-09-27 16:00:59 2016_275_02_1
    6:       2016_275_02 275_02_0039.JPG 2016-09-27 16:01:27 2016_275_02_1
    7:       2016_275_02 275_02_0062.JPG 2016-10-02 12:22:35 2016_275_02_2
    8:       2016_275_02 275_02_0075.JPG 2016-10-31 03:09:43 2016_275_02_3
    

    数据

    将打印的示例数据转换为 data.table 对象来使用有点棘手:

    library(data.table)
    library(magrittr)
    
    station_photos <- "
       year_unit_station    Photo_Number   Creation_Datetime bin_name
    1:       2016_275_02 275_02_0017.JPG 2016-09-23 11:51:03
    2:       2016_275_02 275_02_0035.JPG 2016-09-27 15:58:21
    3:       2016_275_02 275_02_0036.JPG 2016-09-27 15:58:49
    4:       2016_275_02 275_02_0037.JPG 2016-09-27 16:00:04
    5:       2016_275_02 275_02_0038.JPG 2016-09-27 16:00:59
    6:       2016_275_02 275_02_0039.JPG 2016-09-27 16:01:27
    7:       2016_275_02 275_02_0062.JPG 2016-10-02 12:22:35
    8:       2016_275_02 275_02_0075.JPG 2016-10-31 03:09:43" %>% 
      readr::read_fwf(col_types = "-ccc") %>% 
      setDT() %>% 
      setnames(.[1, unlist(.SD)]) %>% 
      .[-1] %>% 
      .[, Creation_Datetime := anytime::anytime(Creation_Datetime)]
    
    station_bins <- "
       year_unit_station    service_end_dttm      bin_name
    1:       2016_275_02 2016-09-23 11:21:00 2016_275_02_1
    2:       2016_275_02 2016-09-30 10:45:00 2016_275_02_2
    3:       2016_275_02 2016-10-07 08:31:00 2016_275_02_3" %>% 
      readr::read_fwf(col_types = "-ccc") %>% 
      setDT() %>% 
      setnames(.[1, unlist(.SD)]) %>% 
      .[-1] %>% 
      .[, service_end_dttm := anytime::anytime(service_end_dttm)]
    

    【讨论】:

    • 抱歉,数据很难以可用的格式获取,我还是新手在这里发布问题。如果您对如何放置示例数据有建议,我愿意接受。至于你的日期问题,那个日期是相机第一次打开的时间,我使用那个“开始时间”作为每个垃圾箱的标签。这意味着 2016_275_02_1 bin 中的照片是在该 bin 的时间戳和下一个 bin 的时间戳之间拍摄的。我对滚动连接或引用更新一无所知,我一定会尝试一下!我的另一个解决方案不太优雅。
    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2014-09-11
    相关资源
    最近更新 更多