Поиск даты окончания предыдущего месяца - PullRequest
0 голосов
/ 08 ноября 2018

С 31.10.2008 г. хочу получить 30.09 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 голосов
/ 08 ноября 2018

Мне нравится 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"
0 голосов
/ 08 ноября 2018

Я не использую функцию 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"

Создано в 2018-11-09 пакетом представительство (v0.2.1)

0 голосов
/ 08 ноября 2018

Целочисленные единицы 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"
...