有没有办法在 postgres 后端使用 lubridates:floor_date() 和非标准单位(如“2 个月”)?或者好的替代方案?

问题描述 投票:0回答:1

有没有办法在 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
r postgresql lubridate
1个回答
0
投票

我在评论中暗示了这一点,但对于将日期推迟两个月意味着什么,没有达成共识或标准理解。 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)
© www.soinside.com 2019 - 2024. All rights reserved.