本文介绍如何处理日期序列数据,并对每天的数据按照月、年进行汇聚。
日期处理
汇聚日期序列数据,即按照一定的日期间隔进行分组汇总。因此需要从日期字段中抽取年、月、日、季度等信息。通常方法通过format函数实现。
#define date
date <- as.Date("2021-01-25")
#format date
formatted_date <- format(date, format="%m/%d/%y")
需要抽取日期期间,通过format参数指定。具体内容读者可以查看帮助。这里介绍lubridate包提供的简单直接的方法抽取。
library(lubridate)
library(tidyverse)
df <- tibble(ondate=c("2021-01-01", "2021-04-04" , "2021-07-09"),
sales=c(34, 36, 44))
df %>% mutate(ondate=ymd(ondate),
year =year(ondate),
quarter =quarter(ondate),
month=month(ondate, label = TRUE),
day =day(ondate),
wday =wday(ondate, week_start=1)
) -> df
df
# A tibble: 3 x 7
# ondate sales year quarter month day wday
# <date> <dbl> <dbl> <int> <ord> <int> <dbl>
# 1 2021-01-01 34 2021 1 1月 1 5
# 2 2021-04-04 36 2021 2 4月 4 7
# 3 2021-07-09 44 2021 3 7月 9 5
上面示例中代码非常直接,lubridate较内置format函数优势非常明显。下面我们利用该方法处理日期并进行数据汇聚。
汇聚日期序列数据
**准备数据
set.seed(1)
#create data frame
ds <- tibble(ondate = as.Date("2020-12-01") + 0:99,
sales = runif(100, 20, 50))
head(ds)
# A tibble: 6 x 2
# ondate sales
# <date> <dbl>
# 1 2020-12-01 28.0
# 2 2020-12-02 31.2
# 3 2020-12-03 37.2
# 4 2020-12-04 47.2
# 5 2020-12-05 26.1
# 6 2020-12-06 47.0
** 抽取日期
ds %>% mutate(year = year(ondate),
quarter = quarter(ondate),
month = month(ondate)
) -> ds
head(ds)
# ondate sales year quarter
# <date> <dbl> <dbl> <int>
# 1 2020-12-01 28.0 2020 4
# 2 2020-12-02 31.2 2020 4
# 3 2020-12-03 37.2 2020 4
# 4 2020-12-04 47.2 2020 4
# 5 2020-12-05 26.1 2020 4
# 6 2020-12-06 47.0 2020 4
** 汇聚数据
# 按年汇总
ds %>% group_by(year) %>% summarise(ymean=mean(sales), ysum=sum(sales))
# year ymean ysum
# <dbl> <dbl> <dbl>
# 1 2020 35.3 1093.
# 2 2021 35.7 2460.
# 按季度汇总
ds %>% group_by(quarter) %>% summarise(qmean=mean(sales), qsum=sum(sales))
# quarter qmean qsum
# <int> <dbl> <dbl>
# 1 1 35.7 2460.
# 2 4 35.3 1093.
# 按月汇总2021年数据
ds %>% filter(ondate >='2021-01-01')%>%
group_by(month) %>%
summarise(mmean=mean(sales), msum=sum(sales))
# month mmean msum
# <dbl> <dbl> <dbl>
# 1 1 35.6 1105.
# 2 2 35.2 985.
# 3 3 37.0 370.
本文参考链接:https://blog.csdn.net/neweastsun/article/details/122049940