找到R中两个时间范围(POSIXct)之间的平均值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找到R中两个时间范围(POSIXct)之间的平均值相关的知识,希望对你有一定的参考价值。

我的数据在表格中

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

class:Time - Posixct Value - Numeric

现在,我想找到R的2017-01-01 01:00:00和2017-01-01 03:00:00的时间范围之间的Value值的平均值。我这次失败了很难系列数据。我怎么做?

答案

为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

希望这可以帮助! (^წ^)

另一答案

希望这可以帮助!

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")
另一答案

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)

以上是关于找到R中两个时间范围(POSIXct)之间的平均值的主要内容,如果未能解决你的问题,请参考以下文章

使用 dplyr 包按时间平均 - R

在 R 中使用 as.POSIXct 为相同的字符结构提供 na

在一个范围内减去两个指标,然后找到平均值

R中从POSIXct到日期的日期转换

在 R 中使用 dplyr::if_else() 根据另一个变量的值更改 POSIXct 时间戳的时区

在 R 中转换 POSIXct 会在 3.5.0 版中产生 NA [重复]