我试图创建一个代码,从从给定开始日期开始的一系列日期中过滤连续5天,跨越多年,我被搞砸了.

示例:

v = seq.Date(as.Date("2000-01-01"), as.Date("2020-12-31"), 1)

initial_date = as.Date("01-01") #(mm:dd)

预期输出:

2000-01-01 #(YYYY:mm:dd)
2000-01-02
2000-01-03
2000-01-04
2000-01-05
2001-01-01
2001-01-02
2001-01-03
2001-01-04
2001-01-05
...
2020-01-01
2020-01-02
2020-01-03
2020-01-04
2020-01-05

例如,如果初始日期为12-31(mm:dd),则结果应为:

2000-12-31
2001-01-01
2001-01-02
2001-01-03
2001-01-04
2001-31-12
2002-01-01
2002-01-02
2002-01-03
2002-01-04
...
2019-12-31
2020-01-01
2020-01-02
2020-01-03
2020-01-04
2020-12-31

有什么建议吗?

推荐答案

此函数使用strftime(format = "%m-%d")比较日期,同时忽略年份,然后将0n - 1天添加到每个匹配日期,然后子集为原始日期向量中显示的结果.

get_days <- function(dates, mmdd, n = 5) {
  stopifnot(n >= 1)
  out <- dates[strftime(dates, "%m-%d") == mmdd]
  out <- out + rep(0:(n - 1), each = length(out))
  sort(out[out %in% dates])
}

get_days(v, "12-31")
#  [1] "2000-12-31" "2001-01-01" "2001-01-02" "2001-01-03" "2001-01-04" "2001-12-31"
#  [7] "2002-01-01" "2002-01-02" "2002-01-03" "2002-01-04" "2002-12-31" "2003-01-01"
#  ...
# [91] "2018-12-31" "2019-01-01" "2019-01-02" "2019-01-03" "2019-01-04" "2019-12-31"
# [97] "2020-01-01"

与我之前的解决方案不同,这确实考虑到了闰年:

get_days(v, "02-27")
## note 2000 includes 2/29 and ends on 3/2, while other years end on 3/3
#  [1] "2000-02-27" "2000-02-28" "2000-02-29" "2000-03-01" "2000-03-02" "2001-02-27"
#  [7] "2001-02-28" "2001-03-01" "2001-03-02" "2001-03-03" "2002-02-27" "2002-02-28"
#  ...
# [91] "2018-02-27" "2018-02-28" "2018-03-01" "2018-03-02" "2018-03-03" "2019-02-27"
# [97] "2019-02-28" "2019-03-01" "2019-03-02" "2019-03-03"

R相关问答推荐

根据收件箱中的特定值提取列名

寻找图片边缘

如何删除gggvenn与gggplot绘制的空白?

手动打印线型gplot

根据多个条件增加y轴高度以适应geom_text标签

使用R闪光显示所有数据点作为默认设置

将多列合并为单独的名称—值对

根据现有列的名称和字符串的存在进行变异以创建多个新列

R Select()可以测试不存在的子集列

线性模型斜率在减少原始数据时提供NA

无法定义沿边轨迹的 colored颜色 渐变(与值无关)

TreeNode打印 twig 并为其上色

在多页PDF中以特定布局排列的绘图列表不起作用

KM估计的差异:SvyKm与带权重的调查

将多个变量组合成宽格式

'使用`purrr::pwalk`从嵌套的嵌套框架中的列表列保存ggplots时出现未使用的参数错误

有毒元素与表观遗传年龄的回归模型

隐藏基于 case 总数的值

把代码写成dplyr中的group_by/摘要更简洁吗?

随机生成样本,同时在R内的随机样本中至少包含一次所有值