【问题标题】:How can I find the mean between two time range(POSIXct) in R?如何在 R 中找到两个时间范围(POSIXct)之间的平均值?
【发布时间】:2017-12-23 11:33:47
【问题描述】:

我的数据在表格中

Time Value
2017-01-01 01:00:00 10
2017-01-01 01:30:00 12.25
2017-01-01 01:40:00 12.76
2017-01-01 02:10:00 17.57
2017-01-01 03:00:00 19.01
2017-01-01 03:08:00 14.41
2017-01-01 04:00:00 11.23

类: 时间 - Posixct 值 - 数字

现在,我想在 R 中找到 2017-01-01 01:00:00 和 2017-01-01 03:00:00 时间范围之间的 Value 列的平均值。 我在处理这个时间序列数据时惨遭失败。我该怎么做?

【问题讨论】:

    标签: r time-series


    【解决方案1】:
    library(dplyr)
    df %>%
      filter(between(Time, as.POSIXct('2017-01-01 01:00:00'), as.POSIXct('2017-01-01 03:00:00'))) %>%
      summarise(mean = mean(Value))
    

    #sample data
    > dput(df)
    structure(list(Time = structure(c(1483212600, 1483214400, 1483215000, 
    1483216800, 1483219800, 1483220280, 1483223400), class = c("POSIXct", 
    "POSIXt"), tzone = ""), Value = c(10, 12.25, 12.76, 17.57, 19.01, 
    14.41, 11.23)), .Names = c("Time", "Value"), row.names = c(NA, 
    -7L), class = "data.frame")
    

    【讨论】:

      【解决方案2】:

      为 ymd_hms 函数加载库 lubridate

      library(lubridate)
      
      Time_Val_dataframe <- data.frame(Time=c("2017-01-01 01:00:00","2017-01-
      01 01:30:00", "2017-01-01 01:40:00", "2017-01-01 02:10:00","2017-01-01 
      03:00:00", "2017-01-01 03:08:00","2017-01-01 04:00:00"), Value=c(10, 
      12.25, 12.76, 17.57, 19.01, 14.41, 11.23))
      

      从一个字符到另一个时间改变时间的类

      Time_Val_dataframe$Time <- ymd_hms(Time_Val_dataframe$Time) 
      
      
      library(dplyr)
      
      
      Time_Val_dataframe %>% 
      filter(ymd_hms("2017-01-01 03:00:00") > Time & 
      Time > ymd_hms("2017-01-01 01:00:00")) %>% summarise(mean=mean(Value))
      

      平均:14.19333

      Time_Val_dataframe %>% 
      filter(ymd_hms("2017-01-01 03:00:00") >= Time & 
      Time >= ymd_hms("2017-01-01 01:00:00")) %>% summarise(mean=mean(Value))
      

      平均:14.318

      Time_Val_dataframe %>% 
      filter(ymd_hms("2017-01-01 03:00:00") > Time & 
      Time >= ymd_hms("2017-01-01 01:00:00")) %>% summarise(mean=mean(Value))
      

      平均值:13.145

      Time_Val_dataframe %>% 
      filter(ymd_hms("2017-01-01 03:00:00") >= Time & 
      Time > ymd_hms("2017-01-01 01:00:00")) %>% summarise(mean=mean(Value))
      

      平均值:15.3975

      【讨论】:

        【解决方案3】:

        1) 假设输入 DF 可重现地显示在下面的注释中(并且如果有超过一天,您需要指定时间之间所有天的平均值)然后将时间提取为字符串,执行所需的子集并取平均值。没有使用任何包。

        tim <- sub(".* ", "", DF$Time)
        mean(DF$Value[tim >= "01:00:00" & tim <= "03:00:00"])
        ## [1] 14.318
        

        1a) 第一行也可以是:

        tim <- format(DF$Time, "%H:%M:%S")
        

        2)如果有几天,并且每天都需要分别的平均值,那么:

        DF2 <- transform(DF, Date = as.Date(Time), Time = sub(".* ", "", Time))
        DF0 <- subset(DF2, Time >= "01:00:00" & Time <= "03:00:00")
        aggregate(Value ~ Date, DF0, mean)
        ##         Date  Value
        ## 1 2017-01-01 14.318
        

        注意

        Lines <- "Time,Value
        2017-01-01 01:00:00,10
        2017-01-01 01:30:00,12.25
        2017-01-01 01:40:00,12.76
        2017-01-01 02:10:00,17.57
        2017-01-01 03:00:00,19.01
        2017-01-01 03:08:00,14.41
        2017-01-01 04:00:00,11.23"
        DF <- read.csv(text = Lines)
        DF$Time <- as.POSIXct(DF$Time)
        

        【讨论】:

          猜你喜欢
          • 2022-07-06
          • 1970-01-01
          • 1970-01-01
          • 2020-04-01
          • 2017-10-29
          • 1970-01-01
          • 1970-01-01
          • 2020-06-25
          • 1970-01-01
          相关资源
          最近更新 更多