r - 使用 Dbplyr 时将日期转换为年-季度格式
问题描述
我在数据库中有一个数据框,其中包含我使用 RPostgres/RpostgreSQL 和 dbplyr 提取的日期维度。每个日期的格式为“YYYY-MM-DD”,我需要添加一个新的日期(或字符)维度,以反映年季度格式“YYYY-Q”中的原始日期(带有破折号,而不是时期)。
鉴于我不能将 lubridate 与 dbplyr 一起使用,我将如何实现这一点?
谢谢你的帮助!这是迄今为止我所拥有的简化版本,因此您可以看到我正在使用哪些包以及我如何连接到数据库。
# Packages
library(RPostgres)
library(RPostgreSQL)
library(dplyr)
library(dbplyr)
# Connect to db
drv <- dbDriver("Postgres")
# Setup connect to db
conn <- dbConnect(drv,
dbname = etc,)
# Define table to use in db
table <- tbl(conn, in_schema("xyz", "abc"))
#Select columns and filter
df <- table %>%
#Filter for pertinent data
filter(date > as.Date("2018-01-01") & date <= as.Date("2020-01-01"))
解决方案
一堆lubridate
函数在dbplyr
. 所以下面的代码对我有用。
这样做的一个好处是,如果小心使用,您可以将数据的位置转移到最有效的位置(在服务器上或本地)。
library(dplyr, warn.conflicts = FALSE)
library(DBI)
library(lubridate)
#>
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:base':
#>
#> date, intersect, setdiff, union
pg <- dbConnect(RPostgres::Postgres(), bigint = "integer")
calls <- tbl(pg, sql("SELECT * FROM streetevents.calls"))
calls %>%
mutate(yq = paste0(year(start_date), "-", quarter(start_date))) %>%
select(start_date, yq)
#> # Source: lazy query [?? x 2]
#> # Database: postgres [iangow@/tmp:5432/crsp]
#> start_date yq
#> <dttm> <chr>
#> 1 2013-09-10 19:30:00 2013-3
#> 2 2003-10-22 15:00:00 2003-4
#> 3 2009-10-22 16:00:00 2009-4
#> 4 2017-02-09 06:00:00 2017-1
#> 5 2010-02-22 22:00:00 2010-1
#> 6 2016-08-08 20:30:00 2016-3
#> 7 2016-05-11 13:00:00 2016-2
#> 8 2012-05-15 16:20:00 2012-2
#> 9 2004-08-19 21:00:00 2004-3
#> 10 2017-07-06 13:30:00 2017-3
#> # … with more rows
calls %>%
collect(n = 10) %>%
mutate(yq = paste0(year(start_date), "-", quarter(start_date))) %>%
select(start_date, yq)
#> # A tibble: 10 x 2
#> start_date yq
#> <dttm> <chr>
#> 1 2013-09-10 19:30:00 2013-3
#> 2 2003-10-22 15:00:00 2003-4
#> 3 2009-10-22 16:00:00 2009-4
#> 4 2017-02-09 06:00:00 2017-1
#> 5 2010-02-22 22:00:00 2010-1
#> 6 2016-08-08 20:30:00 2016-3
#> 7 2016-05-11 13:00:00 2016-2
#> 8 2012-05-15 16:20:00 2012-2
#> 9 2004-08-19 21:00:00 2004-3
#> 10 2017-07-06 13:30:00 2017-3
由reprex 包(v1.0.0)于 2021-04-03 创建
推荐阅读
- sql - Oracle SQL 在一个条件下聚合两列
- mysql - 如何取回 MySQL/MariaDB 中更新的所有行
- php - 如何使用 php 和 mysql 将图像插入数据库和目标文件夹?
- sql - SQL 连接具有不同详细信息级别的两个表
- javascript - 如何从承诺内部将函数作为订阅返回
- python - groupby pandas的concat结果
- cakephp - 删除和确认消息中不允许的方法未显示 Cakephp 3
- arrays - $elemMatch 运算符在 mongodb 中无法正常工作
- c# - WPF OnPropertyChanged - 通知另一个 VM
- angular - Angular Dynamic Reactive Form Nested - CheckBoxes 的 FormArray 方法