按 R 中不同长度的组将日期时间列值舍入为小时

问题描述 投票:0回答:1

这是我的第一篇文章,请耐心等待。

示例数据

我的数据帧来自高频浮标,在湖中的离散深度进行测量。

library(rLakeAnalyzer)
library(tidyverse)
library(plyr)

PFL_counter = c(2,2,2,3,3,3,4,4)
depth = c(0.5,1.0,1.5,0.5,1.0,1.5,0.5,1.0)
temp_C = c(14.27,14.22,14.20,14.23,14.23,14.22,14.23,14.22)
datetime = c("5/11/23 17:01","5/11/23 17:02","5/11/23 17:04",
             "5/11/23 18:01","5/11/23 18:22","5/11/23 19:14",
             "5/11/23 19:14","5/11/23 19:16")

Carmi_23 = data.frame(PFL_counter, depth ,temp_C, datetime)
Carmi_23$datetime = mdy_hm(Carmi_23$datetime)

Carmi_23

实际数据有 58522 个观测值,深度从 0.5 到 9 MAX(例如有时只会到 7),计数器正在计算迄今为止进行的深度剖面的数量(从 2 到 272),以及温度测量值制作〜1-3分钟。

目标

每小时应有 1 个深度剖面。我的目标是将每个日期时间的深度剖面四舍五入到小时(您可以将其视为其 PFL_counter 组)。像这样:


PFL_counter = c(2,2,2,3,3,3,4,4)
depth = c(0.5,1.0,1.5,0.5,1.0,1.5,0.5,1.0)
temp_C = c(14.27,14.22,14.20,14.23,14.23,14.22,14.23,14.22)
datetime = c("5/11/23 17:00","5/11/23 17:00","5/11/23 17:00",
             "5/11/23 18:00","5/11/23 18:00","5/11/23 18:00",
             "5/11/23 19:00","5/11/23 19:00")

Carmi_23 = data.frame(PFL_counter, depth ,temp_C, datetime)
Carmi_23$datetime = mdy_hm(Carmi_23$datetime)

Carmi_23

问题和我的尝试

问题是,对于某些深度剖面,需要一个多小时才能完成测量,因此最后几个深度与剖面开始时(0.5 深度)不在同一小时内。上面第 6 行第一个代码块中的示例。

我的第一个方法(在我意识到深度剖面有时需要一个多小时之前):

Carmi_23$datetime = floor_date(Carmi_23$datetime, "hour") # tried this Carmi_23$datetime = round_date(Carmi_23$datetime, "10 mins") # also this Carmi_23$datetime = floor_date(Carmi_23$datetime, "hour")
当我需要pivot_wider时,这会成为一个问题,因为这样我一个小时会得到半行,另一个小时会得到半行(而且我无法为rLakeAnalyzer热图提供NA)。在示例数据中:

testingpivot = Carmi_23 %>% select(datetime=datetime, depth=depth, temp_C=temp_C) %>% pivot_wider(id_cols=datetime, names_from=depth, values_from=temp_C, values_fn=function(x) mean(x, na.rm=TRUE) ) %>% rename_with(~ paste0("wtr_", .), -datetime) #%>% na.omit() leave until figured out testingpivot
我还参观了图书馆(露天)

library(openair) Carmi_23$date = Carmi_23$datetime Carmi_openair = timeAverage(Carmi_23, avg.time = "hour", type = "PFL_counter") # datetime needs to be called "date"
但是这会平均所有列值,以便时间被折叠成平均每小时一行......

我的下一个尝试是尝试分组、平均值和总结,但关键是我需要对深度剖面内的所有深度重复日期时间。

有人有什么想法吗?我可以在旋转后省略行,因为这使得时间被分成两半,但我内心非常顽固的一部分想弄清楚它。

谢谢!

r dataframe datetime time-series na
1个回答
0
投票

floor_date()

 将起作用。如果它们是字符格式,那么您可以使用库 
dmy_hm()
 中的 
lubridate
 解析它们,然后对其应用 
floor_date()

a <- as.POSIXct("5/11/23 17:01", format="%d/%m/%Y %H:%M") floor_date(a, unit = "hour") a <- as.character("5/11/23 17:01") dmy_hm(a) floor_date(dmy_hm(a), unit = "hour")
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.