提问者:小点点

如何在r中按时间聚合/求和值


有2个问题:

  1. 我有因子格式的时间数据,我想将其更改为日期格式以供以后操作。
  2. 目标是对同一时间单位的降水量求和,例如每小时降水量。

我试图在lubridate中使用as. POSIXct()as.date()转换时间,但总是在定义格式后获得NA值。这是我使用的代码:

tt=as.POSIXct(FixUseNew$StartTimestamp, )
df$time <- as.Date(df$time, "%d-%m-%Y")

If I leave out the format and do the following : 
tt=as.POSIXct(df$time)

tt 

hour(tt)

现在的日期数据如下所示:"010-07-14 00:38:00 LMT"

我想使用聚合函数来求和相同小时间隔或一天的降水,但无法做到这一点,因为我坚持使用日期格式。

只是一个脑残。我打算把日期因素改为字符,然后改为日期格式,如下所示。请告知这是不是个好主意。

df$time <-paste(substr(df$time,6,7),
                              substr(df$time,9,10), 
                              substr(df$time,1,4),sep="/")

以下是数据的子集,希望这有助于更好地说明问题:

Id <- c(1,2,3,4)
Time <- c("10/7/2014  12:30:00 am", "10/7/2014  01:00:05 am","10/7/2014  01:30:10 am", "10/7/2014  02:00:15 am")
Precipitation <- c(0.06, 0.02,0,0.25)
cbind(Id, Time, Precipitation)

太谢谢你了。

结果如下:似乎顺序被扭曲了:

6      1/1/15 0:35         602
7      1/1/15 0:36         582
8      1/1/15 0:37         958
9      1/1/15 0:38         872
10    1/10/14 0:31         500
11    1/10/14 0:32         571
12    1/10/14 0:33         487
13    1/10/14 0:34         220
14    1/10/14 0:35         550
15    1/10/14 0:36         582
16    1/10/14 0:37         524
17    1/10/14 0:38         487

           ⋮

106 10/10/14 15:16         494
107  10/10/14 7:53          37
108  10/10/14 7:56          24
109  10/10/14 8:01           3
110  10/11/14 0:30         686
111  10/11/14 0:31         592
112  10/11/14 0:32         368
113  10/11/14 0:33         702
114  10/11/14 0:34         540
115  10/11/14 0:35         564

共1个答案

匿名用户

使用dplyrlubridate包,我们可以从每个Timesum中提取小时

library(dplyr)
library(lubridate)

df %>%
  mutate(hour = hour(dmy_hms(Time))) %>%
  group_by(hour) %>%
  summarise(Precipitation = sum(Precipitation, na.rm = TRUE))

对于按日期聚合,我们可以做

df %>%
  mutate(day = as.Date(dmy_hms(Time))) %>%
  group_by(day) %>%
  summarise(Precipitation = sum(Precipitation, na.rm = TRUE))

用R打底我们可以

df$Hour <- format(as.POSIXct(df$Time, format = "%d/%m/%Y %I:%M:%S %p"), "%H")
df$Day <- as.Date(as.POSIXct(df$Time, format = "%d/%m/%Y %I:%M:%S %p"))

#Aggregation by hour
aggregate(Precipitation~Hour, df, sum, na.rm = TRUE)

#Aggregation by date
aggregate(Precipitation~Day, df, sum, na.rm = TRUE)

编辑

根据最新的数据和信息,我们可以做

df <- readxl::read_xlsx("/path/to/file/df (1).xlsx")

hour_df <- df %>%
             group_by(hour = hour(Time)) %>%
             summarise(Precipitation = sum(Precipitation, na.rm = TRUE))


day_df <-  df %>%
              mutate(day = as.Date(Time)) %>%
              group_by(day) %>%
              summarise(Precipitation = sum(Precipitation, na.rm = TRUE))

所以hour_df得到了每小时sum的值,而没有考虑日期day_df得到了sum沉淀的每一天。

数据

Id <- c(1,2,3,4)
Time <- c("10/7/2014  12:30:00 am", "10/7/2014  01:00:05 am",
          "10/7/2014  01:30:10 am", "10/7/2014  02:00:15 am")
Precipitation <- c(0.06, 0.02,0,0.25)
df <- data.frame(Id, Time, Precipitation)