使用rbcb包聚合巴西央行日数据为月数据时summarize结果全相同
问题分析与解决方案:rbcb包日度转月度数据异常
问题场景
尝试用rbcb包获取巴西央行Selic利率日度数据并聚合为月度均值,但运行后所有行结果均为相同值,且分组仍按日度显示。
原代码:
selic <- get_series(432, start_date = '2001-12-03', end_date = '2023-02-01') nomes <- c("mes","selic") colnames(selic) <- nomes selic$meses <- floor_date(selic$mes) m_selic <- selic %>% group_by(meses) %>% summarise(mean = mean(selic)) %>% as.data.frame()
异常输出:
head(m_selic): # A tibble: 6 × 2 meses `mean(selic)` <dttm> <dbl> 1 2001-12-03 00:00:00 19 2 2001-12-04 00:00:00 19 3 2001-12-05 00:00:00 19 4 2001-12-06 00:00:00 19 5 2001-12-07 00:00:00 19 6 2001-12-08 00:00:00 19
错误原因
- 分组维度错误:
floor_date(selic$mes)未指定聚合单位,默认按输入日期的精度(日度)截断,导致meses列仍为每日日期,分组后每个组仅包含一行数据,均值等于该行自身值。 - 缺失值处理缺失:未设置
na.rm = TRUE,若数据存在缺失值会直接导致均值计算结果为NA。
修正后的代码
library(rbcb) library(dplyr) library(lubridate) selic <- get_series(432, start_date = '2001-12-03', end_date = '2023-02-01') colnames(selic) <- c("mes", "selic") # 将日期截断到当月第一天,指定unit = "month"实现月度分组 selic$meses <- floor_date(selic$mes, unit = "month") # 按月份分组计算均值,添加na.rm = TRUE处理缺失值 m_selic <- selic %>% group_by(meses) %>% summarise(mean_selic = mean(selic, na.rm = TRUE)) %>% as.data.frame() # 查看修正后的结果 head(m_selic)
关键修正说明
floor_date(selic$mes, unit = "month"):将所有日度日期统一转换为当月第一天,确保分组维度为月份而非单日。mean(selic, na.rm = TRUE):计算月度均值时自动忽略缺失值,避免结果出现NA。- 重命名均值列为
mean_selic,提升列名可读性。
内容的提问来源于stack exchange,提问作者vini.m.oliveira
相关产品推荐
相关产品推荐

