【问题标题】:R: assign months to day of the yearR:将月份分配给一年中的一天
【发布时间】:2018-02-05 11:12:41
【问题描述】:

这是我的数据,其中一列有 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 可能的解决方案。

【问题讨论】:

    标签: r dplyr as.date


    【解决方案1】:

    我们可以通过使用适当的format(即%Y %j)将其转换为日期时间类,然后使用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
    

    【讨论】:

    • 到底为什么是+1
    • @KS89 因为strptime 月份从 0 开始
    【解决方案2】:

    这应该为您提供月份的整数值:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 2017-12-04
      相关资源
      最近更新 更多