Даты Юлии: Последний день предыдущего месяца

#date #julia

Вопрос:

Я работаю в Джулии с кадрами данных и хочу отфильтровать некоторые столбцы даты и времени. Для этого мне нужен последний день месяца, предшествующего месяцу, когда выполняется задание с данными.

Например, если сегодняшняя дата Date("2021-07-21") , я хотел бы получить 2021-06-30 .

Я все время делаю это в SQL с красным смещением, что выглядит примерно так:

 select last_day(current_date - interval '1 month');
┌────────────┐
│  last_day  │
├────────────┤
│ 2021-06-30 │
└────────────┘
 

Ответ №1:

Прежде чем я вспомнил проверить даты стандартной библиотеки Julia, я нашел какой-то веб-учебник, в котором упоминались только функции даты floor/ceil :

 using Dates

julia> floor(today(), Month) - Day(1)
2021-06-30

julia> typeof(ans)
Date

julia> floor(now(),Month) - Day(1)
2021-06-30T00:00:00
 

Это работает нормально, и я не вижу, как это может не сработать. Однако всегда отличные документы Julia описывают специальные функции для этого.

 julia> lastdayofmonth(today() - Month(1))
2021-06-30

# maybe a leap year would cause a problem
julia> lastdayofmonth(Date("20200331","yyyymmdd") - Month(1))
2020-02-29

julia> lastdayofmonth(Date("20200229","yyyymmdd")   Month(1))
2020-03-31
 

Есть много полезных функций, таких как firstdayofmonth() , dayofweek() , isleapyear() . Похоже, все в порядке!

Изменить: арифметика даты должна быть внутри функции

Исправлена следующая ошибка, я вычитал месяц после нахождения последнего дня, работает в постгресе, но не в датах Юлии:

 # WRONG, works only if prior month is shorter
lastdayofmonth(today()) - Month(1)

lastdayofmonth(Date("20210228", "yyyymmdd")) - Month(1)
2021-01-28
 

Комментарии:

1. Разве так не должно быть lastdayofmonth(today() - Month(1)) ? Обратите внимание на скобки в конце. См., например, результат, lastdayofmonth(Date("20200624", "yyyymmdd")) - Month(1)

2. ах! Спасибо @hckr, вы снова правы. Решение для редактирования.