为日期创建标签

Creating Labels for Dates

我在 R 中工作。我有一个包含采样日期和水温的数据框。我在下面提供了一个示例数据框:

  Date            Temperature
  2015-06-01      11
  2015-08-11      13
  2016-01-12      2
  2016-07-01      12
  2017-01-08      4
  2017-08-13      14
  2018-03-04      7
  2018-09-19      10
  2019-8-24       8

由于采样日期的不稳定性(由于采样器的现场能力),我无法将年份通常分类为 1 月 1 日至 12 月 31 日,而是使用采样期的开始作为 1 年的开始。在这种情况下,一年将从 6 月 1 日开始,到 5 月 31 日结束,这样我就可以准确地将这些年份相互比较。因此我想要 4 年有以下标签

   Year_One = "2015-06-01" - "2016-05-31"
   Year_Two = "2016-06-01" - "2017-05-31"
   Year_Three = "2017-06-01" - "2018-05-31"
   Year_Four = "2018-06-01" - "2019-08-24"

我的目标是使用这些标签创建一个额外的列,但到目前为止还不能这样做。

使用 strftime 获取年份,然后在 unique 值上制作 factor 级别。我推荐数字而不是文字,因为它们可以自动编码。否则,使用 labels=c("one", "two", ...).

d <- within(d, {
  year <- strftime(Date, "%Y")
  year <- paste("Year", factor(year, labels=seq(unique(year))), sep="_")
})
#          Date temperature   year
# 1  2017-06-01           1 Year_1
# 2  2017-09-01           2 Year_1
# 3  2017-12-01           3 Year_1
# 4  2018-03-01           4 Year_2
# 5  2018-06-01           5 Year_2
# 6  2018-09-01           6 Year_2
# 7  2018-12-01           7 Year_2
# 8  2019-03-01           8 Year_3
# 9  2019-06-01           9 Year_3
# 10 2019-09-01          10 Year_3
# 11 2019-12-01          11 Year_3
# 12 2020-03-01          12 Year_4
# 13 2020-06-01          13 Year_4

数据:

d <- structure(list(Date = structure(c(17318, 17410, 17501, 17591, 
17683, 17775, 17866, 17956, 18048, 18140, 18231, 18322, 18414
), class = "Date"), temperature = 1:13), class = "data.frame", row.names = c(NA, 
-13L))

我用两种不同的方法创建了两列 year1 和 year2。 year2 方法需要所有时间段从 6 月 1 日开始到 5 月 31 日结束(在您的代码中,year_four 结束于 2019-08-24),因此它可能不是您所需要的:

library(tidyverse)
library(lubridate)

dt$Date <- as.Date(dt$Date)

dt %>% 
  mutate(year1= case_when(between(Date, as.Date("2015-06-01") , as.Date("2016-05-31")) ~ "Year_One",
                              between(Date, as.Date("2016-06-01") , as.Date("2017-05-31")) ~ "Year_Two",
                              between(Date, as.Date("2017-06-01") , as.Date("2018-05-31")) ~ "Year_Three",
                              between(Date, as.Date("2018-06-01") , as.Date("2019-08-24")) ~ "Year_Four",
                              TRUE ~ "0")) %>% 
  mutate(year2 = paste0(year(Date-months(5)),"/", year(Date-months(5))+1))

输出:

# A tibble: 9 x 4
  Date       Temperature year1      year2    
  <date>           <dbl> <chr>      <chr>    
1 2015-06-01          11 Year_One   2015/2016
2 2015-08-11          13 Year_One   2015/2016
3 2016-01-12           2 Year_One   2015/2016
4 2016-07-01          12 Year_Two   2016/2017
5 2017-01-08           4 Year_Two   2016/2017
6 2017-08-13          14 Year_Three 2017/2018
7 2018-03-04           7 Year_Three 2017/2018
8 2018-09-19          10 Year_Four  2018/2019
9 2019-08-24           8 Year_Four  2019/2020