根据水年创建日期指数

时间:2018-01-06 00:17:39

标签: r date time

我正在处理水文数据,我需要水年。我已经成功创建了一个基于此论坛之前发布的功能的水年专栏。我想要的是伴随water day,范围从1-365(闰年366),以匹配水年序列。请注意,水年由其结束的日历年指定。例如,2010年水年开始于2009年10月1日,并于2010年9月30日结束。

基本上我想要一个列,从每年10月1日的日期开始到1-365(闰年366)的序列。

我的数据集范围从1950年到2099年,所以我需要一些自动化这个过程。这个问题的闰年部分给了我麻烦。

我在下面提供了代码来创建数据集。

# Create a data_set with datetime, year, month, day, jd, wtr_yr

library(lubridate)

datetime <- seq(as.Date("1950/1/1"), as.Date("2099/12/31"), by = "day")
year <- year(datetime)
month <- month(datetime)
day <- day(datetime)
julian_day <- yday(datetime)

# make dataframe with all time components
datetime_dataframe <- data.frame(datetime, year, month, day, julian_day)

# Create function to derive water year. Credit goes to Caner and MrFlick.

wtr_yr <- function(dates, start_month=10) {
  # Convert dates into POSIXlt
  dates.posix = as.POSIXlt(dates)
  # Year offset
  offset = ifelse(dates.posix$mon >= start_month - 1, 1, 0)
  # Water year
  adj.year = dates.posix$year + 1900 + offset
  # Return the water year
  adj.year
}

#  Use fn to add water year to the dataframe
datetime_dataframe$wtr_yr <-wtr_yr(datetime_dataframe$datetime)

head(datetime_dataframe)

2 个答案:

答案 0 :(得分:1)

这是一种可行的方式。我创建了1949-10-01的日期序列。我先添加water.year。具有月份== 9和日期== 30的行标记并标记为1.其余行为0.使用此列,我为水年创建了一个分组变量。 cumsum(c(F, diff(water.year) < 0))正在做这项工作。一旦我有了分组变量,我就创建了日期序列。我在下面留下最后结果的一部分。

library(dplyr)
library(lubridate)

mydata <- data.frame(date = seq(as.Date("1949-10-01"),as.Date("2099-12-31"), by = "day")) %>%
          mutate(year = year(date),
                 month = month(date),
                 day = day(date),
                 julian_day = yday(date),
                 water.year = if_else(month == 9 & day == 30, 1, 0))

mydata %>%
group_by(water.year = cumsum(c(F, diff(water.year) < 0))) %>%
mutate(water.day = 1:n())

         date year month day julian_day water.year water.day
1  1952-09-01 1952     9   1        245          2       337
2  1952-09-02 1952     9   2        246          2       338
3  1952-09-03 1952     9   3        247          2       339
28 1952-09-28 1952     9  28        272          2       364
29 1952-09-29 1952     9  29        273          2       365
30 1952-09-30 1952     9  30        274          2       366

答案 1 :(得分:1)

这应该有效。我刚刚使用String relation = "<="; double aAA=5.9,bBB=6.999999; 并注意到你希望wtr_day是前一个wtr_yr中9-30天的天数。

difftime