r - R:按日和月将季节分配给日期
问题描述
我有一个数据框,其中包含多年的日期。它看起来像这样(而不是三年,我有 40 年):
DATES<-c(seq(as.Date('2017-01-01'), as.Date('2019-12-31'), by = 'days'))
df<-data.frame(DATES)
对于我想添加季节的每一天。因此,春季应从 3 月 20 日开始,夏季从 6 月 21 日开始,秋季从 9 月 23 日开始,冬季从 12 月 21 日开始。这些日期多年来保持不变。
我想出了以下代码,它有效(至少,我认为是这样)。但是,我想知道,如果没有更优雅的方式来获得我想要的东西。
df$MONTH<-month(df$DATES)
df$DAY<-mday(df$DATES)
df$DAY_PLUS_MONTH<-df$DAY+df$MONTH*100
df <- df %>%
mutate(SEASON = case_when(
DAY_PLUS_MONTH %in% 320:620 ~ 'SPRING',
DAY_PLUS_MONTH %in% 621:922 ~ 'SUMMER',
DAY_PLUS_MONTH %in% 923:1221 ~ 'AUTUMN',
TRUE ~ 'WINTER'))
解决方案
我认为这应该适合你:
cut(lubridate::yday(df$DATES - lubridate::days(79)),
breaks = c(0, 93, 187, 276, Inf),
labels = c("Spring", "Summer", "Autumn", "Winter"))
推荐阅读
- sql - 在 Postgresql 中,如何找到在一个时间范围内仅发生第一个事件的 3 个连续事件?
- php - 在我的 html 网站上显示 php 文件的输出(回显)
- android - Android Studio 中的 AppComparActivity.class 有什么用?我可以将我的方法作为父类写在上面吗?
- python - ScalarQueryParameter 返回类型错误:“列表对象不可调用”
- docker - Docker 是在桌面上运行的安全威胁吗?
- android - Gradle 偶尔会失败,并显示“任务 ':app:generateJsonModelRelease' 执行失败:格式说明符 '%s'”
- java - Android - Webview 获取页面加载时间
- codenameone - 如何在 CN1 中创建此用户界面?
- php - 假设 https 用于两者,PHP 会话是否比 ajax 调用更安全?
- sql-server - 如何为ssis的oledb目标中的列分配一个常量值