查找上个月的结束日期

时间:2018-11-08 17:26:17

标签: r date seq chron

从2018年10月31日开始,我想获得09/30/2018。

我尝试过:

PREV.PROD.DATE<-seq.Date(from=as.Date(chron("10/31/2018")),length=2,by="-1 months")

但它返回:

  

“ 2018-10-31”“ 2018-10-01”

如何获取09/30而不是10/01?

注意:我想避免使用外部软件包,并且希望该解决方案在月底的任何日期都可以使用。

3 个答案:

答案 0 :(得分:3)

Date的整数单位是天,因此您可以这样做:

seq.Date(from=as.Date("2018-10-31"), length=2, by="-1 months") - c(0,1)
# [1] "2018-10-31" "2018-09-30"

如果您想要任意的事前更新日期:

(d <- as.POSIXlt(Sys.Date()))
# [1] "2018-11-08 UTC"
d$mday <- 1L
as.Date(d) - 1
# [1] "2018-10-31"

Sys.Date()替换为您拥有的单个日期。如果要对此向量化:

(ds <- Sys.Date() + c(5, 20, 50))
# [1] "2018-11-13" "2018-11-28" "2018-12-28"
lapply(as.POSIXlt(ds), function(a) as.Date(`$<-`(a, "mday", 1L)) - 1L)
# [[1]]
# [1] "2018-10-31"
# [[2]]
# [1] "2018-10-31"
# [[3]]
# [1] "2018-11-30"

答案 1 :(得分:1)

我喜欢floor日期-将其设为月份的第一天,然后减去1使其设为上个月的最后一天:

x = as.Date("2018-10-31")
library(lubridate)
floor_date(x, unit = "months") - 1
# [1] "2018-09-30"

这是不使用其他软件包的版本:

as.Date(format(x, "%Y-%m-01")) - 1
# [1] "2018-09-30"

答案 2 :(得分:0)

我不使用功能chron。但是我认为duration中的函数lubridate对您有所帮助。 您无需使用floor_date来迷惑您。

library(lubridate)
#> 
#> 载入程辑包:'lubridate'
#> The following object is masked from 'package:base':
#> 
#>     date
library(tidyverse)
better_date <- 
    str_split("10/31/2018",'/') %>% 
    .[[1]] %>% 
    .[c(3,1,2)] %>% 
    str_flatten(collapse = '-') %>% 
    as.Date()
(better_date - duration('1 months')) %>% 
    as.Date()
#> [1] "2018-09-30"

reprex package(v0.2.1)于2018-11-09创建