R:将月份分配给一年中的某一天
R: assign months to day of the year
这是我的数据,其中一列为 10 年,第二列为另一年的 365 天
dat <- data.frame(year = rep(1980:1989, each = 365), doy= rep(1:365, times = 10))
我假设所有年份都是非闰年,即它们有 365 天。
我想创建另一个列 month
,它基本上是这一天所属的月份。
library(dplyr)
dat %>%
mutate(month = as.integer(ceiling(day/31)))
但是,这个解决方案是错误的,因为它将错误的月份分配给了日期。我正在寻找 dplyr
可能的解决方案。
我们可以使用适当的 format
(即 %Y %j
)将其转换为日期时间 class,然后使用 format
month
dat$month <- with(dat, format(strptime(paste(year, doy), format = "%Y %j"), '%m'))
或者用$mon
提取月份加1
dat$month <- with(dat, strptime(paste(year, doy), format = "%Y %j")$mon + 1)
tail(dat$month)
#[1] 12 12 12 12 12 12
这应该为您提供月份的整数值:
dat$month.num <- month(as.Date(paste(dat$year, dat$doy), '%Y %j'))
如果你想要月份名称:
dat$month.names <- month.name[month(as.Date(paste(dat$year, dat$doy), '%Y %j'))]
结果(只显示几行):
> dat[29:33,]
year doy month.num month.names
29 1980 29 1 January
30 1980 30 1 January
31 1980 31 1 January
32 1980 32 2 February
33 1980 33 2 February
这是我的数据,其中一列为 10 年,第二列为另一年的 365 天
dat <- data.frame(year = rep(1980:1989, each = 365), doy= rep(1:365, times = 10))
我假设所有年份都是非闰年,即它们有 365 天。
我想创建另一个列 month
,它基本上是这一天所属的月份。
library(dplyr)
dat %>%
mutate(month = as.integer(ceiling(day/31)))
但是,这个解决方案是错误的,因为它将错误的月份分配给了日期。我正在寻找 dplyr
可能的解决方案。
我们可以使用适当的 format
(即 %Y %j
)将其转换为日期时间 class,然后使用 format
month
dat$month <- with(dat, format(strptime(paste(year, doy), format = "%Y %j"), '%m'))
或者用$mon
提取月份加1
dat$month <- with(dat, strptime(paste(year, doy), format = "%Y %j")$mon + 1)
tail(dat$month)
#[1] 12 12 12 12 12 12
这应该为您提供月份的整数值:
dat$month.num <- month(as.Date(paste(dat$year, dat$doy), '%Y %j'))
如果你想要月份名称:
dat$month.names <- month.name[month(as.Date(paste(dat$year, dat$doy), '%Y %j'))]
结果(只显示几行):
> dat[29:33,]
year doy month.num month.names
29 1980 29 1 January
30 1980 30 1 January
31 1980 31 1 January
32 1980 32 2 February
33 1980 33 2 February