查找上个月的结束日期
Finding previous month end date
从日期 10/31/2018 开始,我想获得 09/30/2018。
我试过了:
PREV.PROD.DATE<-seq.Date(from=as.Date(chron("10/31/2018")),length=2,by="-1 months")
但是 returns:
"2018-10-31" "2018-10-01"
如何获得 09/30 而不是 10/01?
注意:我想避免使用外部包,我希望该解决方案适用于任何月末日期。
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"
我喜欢 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"
我不使用函数chron
。但我认为 lubridate
中的函数 duration
对你有帮助。
你不需要用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 创建
从日期 10/31/2018 开始,我想获得 09/30/2018。
我试过了:
PREV.PROD.DATE<-seq.Date(from=as.Date(chron("10/31/2018")),length=2,by="-1 months")
但是 returns:
"2018-10-31" "2018-10-01"
如何获得 09/30 而不是 10/01?
注意:我想避免使用外部包,我希望该解决方案适用于任何月末日期。
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"
我喜欢 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"
我不使用函数chron
。但我认为 lubridate
中的函数 duration
对你有帮助。
你不需要用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 创建