按跨日期的日落至日出夜间时段分组计算DataFrame中value列的均值
跨日期的日落至日出夜间时段分组计算DataFrame中value列的均值
嘿,这个需求太典型了——处理跨日期的夜间时段统计确实容易卡壳,不过咱们用dplyr就能轻松搞定!
首先看你的数据:已经过滤出了日落之后到日出之前的观测,但这些数据跨了两天(比如9月1日20:00到9月2日6:00属于同一个夜间)。核心思路是给每个观测值分配一个统一的夜间标识,把同属一个夜间的观测归到一组,再计算均值。
具体步骤(用tidyverse工具)
- 先加载必要的包(你的数据已经是tbl_df格式,dplyr正好适配):
library(tidyverse)
- 创建夜间分组标识,然后分组计算均值:
# 假设你的数据框名为df df_processed <- df %>% # 给每个观测分配所属的夜间日期 mutate(night_date = case_when( # 日落之后的观测,属于当天的夜间 Datetime >= sunset ~ date, # 日出之前的观测,属于前一天的夜间(比如9月2日凌晨属于9月1日的夜间) Datetime < sunrise ~ date - 1, # 兜底逻辑(你已经过滤了非夜间数据,这个基本用不上) TRUE ~ date )) %>% # 按夜间日期分组 group_by(night_date) %>% # 计算每组value的均值,na.rm=TRUE防止缺失值干扰 summarize(mean_night_value = mean(value, na.rm = TRUE)) %>% # 取消分组(可选,方便后续操作) ungroup()
代码解释
case_when是dplyr里的多条件判断工具,这里用它把当天日落之后和次日日出之前的观测都归到同一个夜间日期(比如9月1日日落+9月2日凌晨的观测,都归到night_date = 2021-09-01);group_by(night_date)把同属一个夜间的所有观测打包成一组;summarize则对每组的value列计算均值,得到每个夜间的平均数值。
运行后你会得到类似这样的结果:
| night_date | mean_night_value |
|---|---|
| 2021-09-01 | 约23.64 |
| 2021-09-02 | 约10.5 |
(具体数值根据你的数据计算,代码会精准得出结果)
要是你还有其他疑问或者需要调整逻辑,随时说哦!
备注:内容来源于stack exchange,提问作者Ryan Gary
相关产品推荐
相关产品推荐

