假设所有年份都是非闰年,则将日期转换为日期

时间:2018-03-12 11:06:07

标签: r date dataframe as.date

我有一年一年和一年的df作为列:

dat <- data.frame(year = rep(1980:2015, each = 365), day = rep(1:365,times = 36))

请注意,即使是闰年,我也假设一年365天。我需要生成两件事:

1个月 2)日期

我这样做了:

# this tells me how many days in each month  
months <- list(1:31, 32:59, 60:90, 91:120, 121:151, 152:181, 182:212, 213:243, 244:273, 274:304, 305:334, 335:365)

library(dplyr)
# this assigns each day to a month
dat1 <- dat %>% mutate(month = sapply(day, function(x) which(sapply(months, function(y) x %in% y))))

我想生成第三列,其格式为year,month,day。 但是,由于我假设所有年份都是非闰年,我需要确保我的日期也反映出来,即2月29日应该没有日期。

我需要生成日期的原因是因为我想生成数字 一年15天的时间。一年将有24个15天的期限

    1st Jan - 15th Jan: 1 period 
    16th Jan- 31st Jan: 2 period 
    1st Feb - 15th Feb: 3 period....
    16th till 31st dec: 24th period)

我需要日期来指定一个月中的某一天是否属于第一天 一半(即日<= 15)或第二季(日> 15)。我使用以下内容 脚本来做到这一点:

dat2 <- dat1 %>% mutate(twowk = month*2 - (as.numeric(format(date,"%d")) <= 15))

为了让我运行上面的这一行,我需要生成date,因此我的问题。

1 个答案:

答案 0 :(得分:3)

可能的解决方案:

dat$dates <- as.Date(paste0(dat$year,'-',
                            format(strptime(paste0('1981-',dat$day), '%Y-%j'),
                                   '%m-%d'))
                     )

这是做什么的:

  • 使用strptime(paste0('1981-',dat$day), '%Y-%j'),您可以获得非闰年的日期。
  • 通过将format'%m-%d'嵌入paste,您可以提取当月的月份和日期。
  • yearas.Date - 列中的年份一起,并将其包含在(\d ?){17} 中以获得非闰年日期。