首页 > 解决方案 > 将月份更改为季节

问题描述

我在 R 工作。我有一个数据框,其中有采样日期、全名采样日期的月份和水温。以下是我的数据框示例。

   Date           Month       Temperature
   2016-07-01     July        13
   2017-01-08     January     5
   2018-09-19     September   11
   2019-10-24     October     9

我想要做的是使用月份并创建一个标记季节的新列。为了这个项目的目的,我将一月至三月分类为冬季,四月至六月为春季,七月至九月为夏季,十月至十二月为秋季。

标签: rlabel

解决方案


Date假设在字段属于类的末尾的注释中可重现地显示输入Date- 如果不是,则将其转换为注释中所示。下面展示了各种方法。前两个转换Date列(看起来更容易),后两个转换Month列。

1) yearqtr 转换Dateyearqtr对象。使用cycleon 将给出季度(1、2、3 或 4),然后我们可以将季度编号索引到seasons.

library(zoo)

seasons <- c("Winter", "Spring", "Summer", "Fall")
transform(DF, Season = seasons[cycle(as.yearqtr(Date))])
##         Date     Month Temperature Season
## 1 2016-07-01      July          13 Summer
## 2 2017-01-08   January           5 Winter
## 3 2018-09-19 September          11 Summer
## 4 2019-10-24   October           9   Fall

如果只使用季度数字就可以了,那么这个单行就足够了。

transform(DF, Season = cycle(as.yearqtr(Date)))

2) Quarters 我们也可以通过使用返回 , 或quarters作为给定日期的字符串的函数Q1Q2使用基数 R 来做到这一点。在这种情况下,我们需要确保使用这些名称以便使用它进行查找。Q3Q4Seasons.Q

Seasons.Q <- c(Q1 = "Winter", Q2 = "Spring", Q3 = "Summer", Q4 = "Fall")
transform(DF, Season = Seasons.Q[quarters(Date)])

如果使用 Q1、Q2、Q3、Q4 代替名称是可以的,那么我们可以将其简化为单行:

transform(DF, Season = quarters(Date))

3) match 上面使用了 Date 字段。我们还可以使用 Month 字段作为我们的输入,将其转换为月份数 1、2、3、...、12,然后将其转换为可以索引到seasons上面定义的季度数。

transform(DF, Season = seasons[(match(Month, month.name) - 1) %/% 3 + 1])

如果季度数字而不是季节名称就足够了,那么我们可以将其简化为单行:

transform(DF, Season = (match(DF$Month, month.name) - 1) %/% 3 + 1)

4)日期格式 我们也可以使用日期格式将月份转换为日期,然后使用quarters和查找到Seasons.Q.

transform(DF, Season = Seasons.Q[quarters(as.Date(paste(DF$Month, "001"), "%B %y%d"))])

笔记

Lines <- "
 Date           Month       Temperature
   2016-07-01     July        13
   2017-01-08     January     5
   2018-09-19     September   11
   2019-10-24     October     9"
DF <- read.table(text = Lines, header = TRUE)
DF$Date <- as.Date(DF$Date)

推荐阅读