首页 > 解决方案 > 在R中创建月份开始和结束的数据框

问题描述

我想从给定的开始和结束日期创建一个数据框:

start_date <- as.Date("2020-05-17")
end_date <- as.Date("2020-06-23")

对于这个数据框中的每一行,我应该有一个月的开始日和结束日,所以预期的输出是:

start       end         month   year
2020-05-17  2020-05-31  May     2020
2020-06-01  2020-06-23  June    2020

我试图创建一个序列,但我坚持下一步该做什么:

day_seq <- seq(start_date, end_date, 1)

请,一个基本的 R 或 tidyverse 解决方案将不胜感激。

标签: rtidyverse

解决方案


1) yearmon使用问题中的 start_date 和 end_date 创建一个 yearmon 序列,然后每个所需的列都是简单的单行计算。在 R 4.0 及以后的版本中,stringAsFactors 行可以省略,因为这是那里的默认设置。

library(zoo)

ym <- seq(as.yearmon(start_date), as.yearmon(end_date), 1/12)

data.frame(start = pmax(start_date, as.Date(ym)),
           end = pmin(end_date, as.Date(ym, frac = 1)),
           month = month.name[cycle(ym)],
           year = as.integer(ym),
           stringsAsFactors = FALSE)

给予:

       start        end month year
1 2020-05-17 2020-05-31   May 2020
2 2020-06-01 2020-06-23  June 2020

2) Base R 这遵循类似的逻辑并给出相同的答案。我们首先定义一个函数month1,它给定一个Date类向量x返回一个相同长度的Date向量,但是对于本月的第一天。

month1 <- function(x) as.Date(cut(x, "month"))

months <- seq(month1(start_date), month1(end_date), "month")
data.frame(start = pmax(start_date, months),
           end = pmin(end_date, month1(months + 31) - 1),
           month = format(months, "%B"),
           year = as.numeric(format(months, "%Y")),
           stringsAsFactors = FALSE)

推荐阅读