【问题标题】:Subsetting data based on time in RR中基于时间的子集数据
【发布时间】:2020-02-25 07:36:02
【问题描述】:

我有一组包含日期和时间列的流量数据,但是,我在根据特定时间正确子集数据时遇到问题。有没有办法根据日期和时间范围正确子集数据?使用过滤器或子集似乎对我不起作用。

例如我想从17/08/201919/08/2019 和以下时间段中提取数据:06:0007:0008:3010:0012:0013:0017:30 到@ 987654330@、19:0020:0020:0022:00。谢谢大家的建议,拜托了!

Vehicle.No. Date Time Payment.Amount
SXX0001A 17/08/2019 00:01 1.25
SXX0002A 17/08/2019 00:21 5
SXX0003A 17/08/2019 00:31 0
SXX0004A 17/08/2019 02:01 3
SXX0005A 17/08/2019 03:01 2
SXX0006A 17/08/2019 18:01 1.25
.
.
.
SXX0007A 18/08/2019 00:01 1.25
SXX0008A 18/08/2019 02:01 1.25
SXX0009A 18/08/2019 19:01 1.25
SXX0010A 18/08/2019 20:01 1.25
.
.
.
SXX0006A 20/08/2019 02:01 1.25
SXX0006A 20/08/2019 03:01 3.25
SXX0006A 20/08/2019 01:01 5.25
SXX0006A 20/08/2019 12:01 0
SXX0006A 20/08/2019 14:01 1.25
.
.
.

【问题讨论】:

    标签: r datetime time subset


    【解决方案1】:

    首先要确保您的DateTime 变量分别采用日期和时间格式。从您提供的内容中无法判断是这种情况还是这些变量是字符还是因素。

    假设它们是字符:

    df <- read.table(
      text = 
    "Vehicle.No. Date Time Payment.Amount
    SXX0001A 17/08/2019 00:01 1.25
    SXX0002A 17/08/2019 00:21 5
    SXX0003A 17/08/2019 00:31 0
    SXX0004A 17/08/2019 02:01 3
    SXX0005A 17/08/2019 03:01 2
    SXX0006A 17/08/2019 18:01 1.25
    SXX0007A 18/08/2019 00:01 1.25
    SXX0008A 18/08/2019 02:01 1.25
    SXX0009A 18/08/2019 19:01 1.25
    SXX0010A 18/08/2019 20:01 1.25
    SXX0006A 20/08/2019 02:01 1.25
    SXX0006A 20/08/2019 03:01 3.25
    SXX0006A 20/08/2019 01:01 5.25
    SXX0006A 20/08/2019 12:01 0
    SXX0006A 20/08/2019 14:01 1.25",
    stringsAsFactors = F,
    header = T
    )
    
    str(df$Date)
    chr [1:15] "17/08/2019" "17/08/2019" "17/08/2019" "17/08/2019" ...
    
    str(df$Time)
    chr [1:15] "00:01" "00:21" "00:31" "02:01" "03:01" "18:01" "00:01" "02:01" ...
    

    让我们以日期和日期时间格式创建 2 个新变量(datedatetime)。我正在创建一个datetime 变量而不是time 变量,因为这稍后会派上用场。 readr 包有很好的向量解析功能。

    library(dplyr)
    library(readr)
    
    df <-
      df %>%
      mutate(
        date = parse_date(Date, "%d/%m/%Y"),
        datetime = parse_datetime(paste(Date, Time), "%d/%m/%Y %H:%M")
      )
    
    str(df$date)
    Date[1:15], format: "2019-08-17" "2019-08-17" "2019-08-17" ...
    
    str(df$datetime)
    POSIXct[1:15], format: "2019-08-17 00:01:00" "2019-08-17 00:21:00" ...
    

    我不清楚您希望如何输出(您是要过滤适合您列出的任何时间的数据?还是要分别过滤每个日期和时间段?)。假设您想要所有适合您列出的任何日期和时间段的数据。

    由于我们需要过滤几天相同的时间段,我们将使用purrr以避免代码重复:

    1. 创建一个过滤数据框列表(每个元素对应一个感兴趣的日子)
    2. 创建一个函数,该函数将过滤某一天所有感兴趣的时间段的数据。该函数使用包lubridate
    3. 由于purrr:map_df() 将函数应用于列表的每个元素并输出一个数据框并删除我们创建的变量timedatetime(尽管也许你应该保留它们并摆脱你的@987654336 @ 和 Time 变量)。
    library(purrr)
    library(lubridate)
    
    ls <- list(
      filter(df, date == "2019-08-17"),
      filter(df, date == "2019-08-18"),
      filter(df, date == "2019-08-19")
    )
    
    
    select_times <- function(df) {
      df %>%
        filter(
          datetime %within% interval(paste(unique(df$date), "06:00:00"),
                                     paste(unique(df$date), "07:00:00")) |
          datetime %within% interval(paste(unique(df$date), "08:30:00"),
                                     paste(unique(df$date), "10:00:00")) |
          datetime %within% interval(paste(unique(df$date), "12:00:00"),
                                     paste(unique(df$date), "13:00:00")) |
          datetime %within% interval(paste(unique(df$date), "17:30:00"),
                                     paste(unique(df$date), "22:00:00"))
        )
    }
    
    map_df(ls, select_times) %>%
      select(- date, - datetime)
    

    输出:

      Vehicle.No.       Date  Time Payment.Amount
    1    SXX0006A 17/08/2019 18:01           1.25
    2    SXX0009A 18/08/2019 19:01           1.25
    3    SXX0010A 18/08/2019 20:01           1.25
    

    这是您感兴趣的日期中感兴趣的时间段的数据子集。

    对于替代解决方案,您可能需要查看包xtsThis post 可能很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 2023-04-08
      • 2017-02-14
      • 1970-01-01
      相关资源
      最近更新 更多