有没有办法在 postgres 后端使用 lubridates:floor_date() 和非标准单位(如“2 个月”)?或者好的替代品?我有一个带有日期列的惰性表,并希望按 x 个月对该列进行分组。 像这样..
tbl(con_postgres, "testdata") %>%
mutate(floor_date(datecolumn, unit = "2 month"))
但这会导致:
Caused by error in `floor_date()`:
! `unit` must be one of "second", "minute", "hour", "day", "week", "month", "quarter", or "year", not "2 month".
i Did you mean "month"?
有什么想法吗?
数据如下:
data = tibble(
Datum = seq.Date(
from = as_date("2024-01-01"),
to = as_date("2024-12-01"),
by = "month"))
data
# A tibble: 12 x 1
Datum
<date>
1 2024-01-01
2 2024-02-01
3 2024-03-01
4 2024-04-01
5 2024-05-01
6 2024-06-01
7 2024-07-01
8 2024-08-01
9 2024-09-01
10 2024-10-01
11 2024-11-01
12 2024-12-01
我想要的数据:
data %>%
mutate(
Datum = floor_date(Datum, unit = "2 month"))
# A tibble: 12 x 1
Datum
<date>
1 2024-01-01
2 2024-01-01
3 2024-03-01
4 2024-03-01
5 2024-05-01
6 2024-05-01
7 2024-07-01
8 2024-07-01
9 2024-09-01
10 2024-09-01
11 2024-11-01
12 2024-11-01
我在评论中暗示了这一点,但对于将日期推迟两个月意味着什么,没有达成共识或标准理解。 IE。例如,也许它的意思是对偶数或奇数月份进行分组? jan feb mar apr 应该转换为 jan jan mar mar 或 feb feb apr apr 吗?
无论如何,我举了一个关于这两种可能性的例子。
library(lubridate)
(some_dates <- seq.Date(from=as.Date("2023-07-01"),
by="month",
length.out =12))
# if month is odd, make it even
require(purrr)
if_even_subtract_1 <- function(x){
map_vec(x,\(i){
if(month(i) %% 2 == 0){
floor_date(i %m-% months(1),unit="month")
} else {
i
}
})
}
if_odd_add_1 <- function(x){
map_vec(x,\(i){
if(month(i) %% 2 != 0){
floor_date(i %m+% months(1),unit="month")
} else {
i
}
})
}
some_dates
if_even_subtract_1(some_dates)
if_odd_add_1(some_dates)