R:将日期从每天转换为每周并绘制它们

Posted

技术标签:

【中文标题】R:将日期从每天转换为每周并绘制它们【英文标题】:R: convert dates from daily to weekly and plotting them 【发布时间】:2021-03-17 14:19:51 【问题描述】:

我正在尝试学习如何处理时间序列数据。我创建了一些假的每日数据,尝试按周汇总然后绘制它:

set.seed(123)
library(xts)
library(ggplot2)

date_decision_made = seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")

date_decision_made <- format(as.Date(date_decision_made), "%Y/%m/%d")

property_damages_in_dollars <- rnorm(731,100,10)

final_data <- data.frame(date_decision_made, property_damages_in_dollars)

y.mon<-aggregate(property_damages_in_dollars~format(as.Date(date_decision_made),
format="%W"),data=final_data, FUN=sum)

y.mon$week = y.mon$`format(as.Date(date_decision_made), format = "%W")`

g = ggplot(y.mon, aes(x = week, y=property_damages_in_dollars) + geom_line(aes(group=1))

该图似乎有效,但轴上只有 52 个“刻度”,而应该是该数量的两倍(有 2 年的数据)。我认为将数据从每日转换为每周时出现问题 - 有人可以告诉我如何解决这个问题吗?

在我的实际数据中,我有 30 年的数据。日期似乎很拥挤。我试图“取消”日期:

library(scales)
g + scale_x_date(date_breaks = "1 week", expand = c(0,0)) +
  theme(axis.text.x = element_text(angle=90, vjust=.5))

但这也行不通。有人可以告诉我我做错了什么吗?

谢谢

注意:如果有两列,是否还可以使用聚合函数?

date_decision_made = seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")

date_decision_made <- format(as.Date(date_decision_made), "%Y/%m/%d")

property_damages_in_dollars <- rnorm(731,100,10)

other_damages_in_dollars <- rnorm(731,10,10)

final_data <- data.frame(date_decision_made, other_damages_in_dollars, property_damages_in_dollars)



y.mon<-aggregate(property_damages_in_dollars,  other_damages_in_dollars ~format(as.Date(date_decision_made),
format="%Y/%m"),data=final_data, FUN=sum)

【问题讨论】:

如果有两列,是否还可以使用聚合函数? date_decision_made = seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day") date_decision_made 【参考方案1】:

一种方法可以像这样将年份添加到一周中:

library(ggplot2)
#Code 1
#Data
y.mon<-aggregate(property_damages_in_dollars~format(as.Date(date_decision_made),
                                                    format="%W-%y"),data=final_data, FUN=sum)

y.mon$week = y.mon$`format(as.Date(date_decision_made), format = "%W-%y")`
#Plot
ggplot(y.mon, aes(x = week, y=property_damages_in_dollars))+
         geom_line(aes(group=1))+
  scale_x_discrete(guide = guide_axis(n.dodge=2))+
  theme(axis.text.x = element_text(angle = 45))

输出:

如果您感到好奇,我将使用scale_x_date() 将其留在这里并直接针对日期进行汇总:

#Code 2
y.mon<-aggregate(property_damages_in_dollars~as.Date(date_decision_made),data=final_data, FUN=sum)
y.mon$week = y.mon$`as.Date(date_decision_made)`
#Plot
ggplot(y.mon, aes(x = week, y=property_damages_in_dollars)) +
  geom_line(aes(group=1))+
  scale_x_date(date_labels = '%Y-%W',breaks = '8 weeks')

输出:

【讨论】:

感谢您的回复!只是一个问题:我模拟了从 2014 年 1 月 1 日到 2016 年 1 月 1 日的日期。这是2年。这段时间不应该有 104 周吗? 如果有两个变量而不是1个,下面的代码还能运行吗? y.mon @stats555 是的,有这个数字,但它们在轴上被躲避以避免重叠! 这可以工作y.mon&lt;-aggregate(cbind(property_damages_in_dollars, other_damages_in_dollars) ~format(as.Date(date_decision_made), format="%Y/%m"), data=final_data, FUN=sum) 我想我明白了:01-14 是 2014 年的“第一周”,01-15 是 2015 年的“第一周”?

以上是关于R:将日期从每天转换为每周并绘制它们的主要内容,如果未能解决你的问题,请参考以下文章

将日期从 Stata 转换为 R

将每日数据转换为每周数据并汇总 R 中的多个列

我有每小时的数据,并希望在 ssas 多维数据集级别将其转换为每周

每周一道算法题009:找二进制对称的日期

将 %B.%Y 转换为日期在 R 中返回 NA [重复]

使用输入“2016-09-25 17:13:46.030”将日期和时间从 Excel 转换为 R