R 基于水年创建日索引
我正在处理水文数据,我需要水年。我已经成功地创建了一个基于之前在这个论坛上发布的功能的水年专栏。我希望随附的R 基于水年创建日索引,r,date,time,R,Date,Time,我正在处理水文数据,我需要水年。我已经成功地创建了一个基于之前在这个论坛上发布的功能的水年专栏。我希望随附的水日范围为1-365(闰年为366),以匹配水年序列。注:水年由其结束的日历年指定。例如,2010年的水年从2009年10月1日开始,到2010年9月30日结束 基本上,我想要一个列,从每年10月1日开始,从1-365(闰年366)开始 我的数据集范围从1950年到2099年,所以我需要某种方法来自动化这个过程。这个问题的闰年部分给我带来了麻烦 我在下面提供了创建数据集的代码 # Crea
水日
范围为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)
#创建日期时间、年、月、日、jd、wtr#yr的数据集
图书馆(lubridate)
datetime这里有一种可能的方法。我从1949-10-01创建了日期序列。我先加了水。无论哪一行的月份==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
库(dplyr)
图书馆(lubridate)
mydata%
突变(年=年(日期),
月=月(日),
天=天(日期),
朱利安日=yday(日期),
水.年=如果有(月=9天=30,1,0))
mydata%>%
分组依据(水年=总和(c(F,差异(水年)<0)))%>%
突变(water.day=1:n()
日期年月日julian_日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
这应该行得通。我刚刚使用了difftime
,并指出您希望wtr_day是前一个wtr_年中9-30天的天数
library(tidyverse)
new_df <- datetime_dataframe %>%
group_by(wtr_yr) %>%
mutate(wtr_day = (as.integer(difftime(datetime,ymd(paste0(wtr_yr - 1 ,'-09-30')), units = "days"))))
库(tidyverse)
新的_df%
分组依据(wtr年)%>%
mutate(wtr_day=(作为.integer(difftime(datetime,ymd)(paste0(wtr_yr-1,'-09-30')),units=“days”))
首先,谢谢!该代码中唯一缺少的是“水年”列(从1951年到2100年)。如果您将我在原始问题中发布的wtr_yr函数添加到您的代码中,您就可以得到它。也就是说,wtr_yr=开始月份-1,1,0)#水年调整年=日期。posix$year+1900+偏移量#返回水年调整年}mydata$wtr#yr