已知充电会话总能耗、起止时间,如何计算每30分钟间隔的总耗电量?
R语言实现30分钟间隔充电耗电量统计
前提假设
- 单条充电会话的耗电量按会话时长均匀分配,该假设为行业通用简化方案,无需额外数据即可实现统计
实现步骤
1. 依赖包安装加载
需要用到lubridate处理时间格式、dplyr做数据清洗、tidyr做行列扩展:
# 首次使用先安装 # install.packages(c("lubridate", "dplyr", "tidyr")) library(lubridate) library(dplyr) library(tidyr)
2. 构造样例数据集
# 样例数据 start.time <- c( "2020-01-01 02:04:14 GMT", "2020-01-01 13:40:42 GMT", "2020-01-01 16:37:10 GMT", "2020-01-01 22:45:54 GMT", "2020-01-02 12:17:41 GMT","2020-01-02 15:52:12 GMT") end.time <- c( "2020-01-01 09:42:50 GMT", "2020-01-01 14:24:48 GMT", "2020-01-01 16:50:23 GMT","2020-01-02 02:11:46 GMT", "2020-01-02 15:00:28 GMT","2020-01-02 16:08:50 GMT") total.kwh <- c(23.493, 2.475, 0.691, 2.418, 9.778, 0.894) # 构造数据框并转换时间格式 charge_df <- data.frame( start_time = ymd_hms(start.time), end_time = ymd_hms(end.time), total_kwh = total.kwh )
3. 核心统计逻辑
result <- charge_df %>% # 计算单会话总时长(秒)和每秒耗电量 mutate( duration_s = as.numeric(difftime(end_time, start_time, units = "secs")), kwh_per_s = total_kwh / duration_s ) %>% # 生成每个会话覆盖的所有30分钟整点区间 rowwise() %>% mutate( interval_30min = list(seq( floor_date(start_time, unit = "30 minutes"), floor_date(end_time, unit = "30 minutes"), by = "30 mins" )) ) %>% unnest(cols = c(interval_30min)) %>% # 计算会话在当前30分钟区间内的实际时长 mutate( period_start = max(start_time, interval_30min), period_end = min(end_time, interval_30min + minutes(30)), period_s = as.numeric(difftime(period_end, period_start, units = "secs")), # 计算当前区间该会话贡献的耗电量 period_kwh = period_s * kwh_per_s ) %>% # 按30分钟区间分组求和,得到总耗电量 group_by(interval_30min) %>% summarise(total_period_kwh = sum(period_kwh), .groups = "drop")
结果说明
result数据框中,interval_30min为30分钟区间的起始整点时间,total_period_kwh为该区间所有充电会话的总耗电量,自动覆盖所有存在充电行为的时间区间,无充电的区间默认不输出。
内容的提问来源于stack exchange,提问作者zmirina
相关产品推荐
相关产品推荐

