r - 在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 解决方案将不胜感激。
解决方案
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)
推荐阅读
- python - Python - 将 dwg 转换为模拟信号
- unity3d - 声明了本地函数“RestartGame”但从未使用过 Assembly-CSharp
- haproxy - HAProxy Lua 无法添加操作
- arrays - 在 10x10 阵列 MIPS 中打印特定行
- reactjs - 通过 gitlab-ci 运行 cypress 测试时找不到 baseUrl
- centos - 收到此错误消息:-“KDC 在获取初始凭据时不支持加密类型”
- pdf - 行间距 Rmarkdown
- java - java.lang.NoClassDefFoundError: org/apache/http/message/BasicNameValuePair
- android - 使用 SQLite 的搜索结果更新 RecyclerView
- javascript - 从 v-select 中的 json 获取值