我正在 Julia 中使用 DataFrames,并且想要过滤一些日期和日期时间列。为此,我需要运行数据作业时上个月的最后一天。
\n例如,如果今天的日期是Date("2021-07-21"),我想获取2021-06-30。
我一直在 Redshift SQL 中执行此操作,如下所示:
\nselect last_day(current_date - interval \'1 month\');\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 last_day \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 2021-06-30 \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\nRun Code Online (Sandbox Code Playgroud)\n\n
在我记得检查Julia 标准库 Dates之前,我发现了一些仅提到日期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
Run Code Online (Sandbox Code Playgroud)
这工作得很好,我不知道它怎么会失败。然而,一直优秀的 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
Run Code Online (Sandbox Code Playgroud)
有许多有用的功能,例如firstdayofmonth()、dayofweek()、isleapyear()。看起来一切都井然有序!
更正了以下错误,我在找到最后一天后减去了月份,在 postgres 中有效,但在 Julia Dates 中无效:
# WRONG, works only if prior month is shorter
lastdayofmonth(today()) - Month(1)
lastdayofmonth(Date("20210228", "yyyymmdd")) - Month(1)
2021-01-28
Run Code Online (Sandbox Code Playgroud)