使用RSQLite时,数据库中的日期数据会发生什么变化?

时间:2017-01-11 20:28:12

标签: r sqlite rsqlite

我开始使用RSQLite和dplyr来高效处理大型数据集。但是,我还没有能够调和如何让RSQLite格式化日期或者最佳实践。下面的例子应该说明这个过程在哪里崩溃:

library(tidyverse)
library(RSQLite)

数据

日期格式正确

date=seq(as.Date("1910/1/1"), as.Date("1911/1/1"), "days")
x=rnorm(length(date))
df1 <- tibble(date, x)
df1

# A tibble: 366 × 2
date           x
<date>       <dbl>
  1  1910-01-01  1.72459562
2  1910-01-02  0.88216253
3  1910-01-03 -0.35434587
4  1910-01-04 -0.63401467
5  1910-01-05  0.18136909
6  1910-01-06 -0.09513488
7  1910-01-07 -1.03252313
8  1910-01-08  0.40924962
9  1910-01-09  0.90759866
10 1910-01-10  0.60456596
# ... with 356 more rows

创建数据库

dbname = "test.sqlite3"
con <- dbConnect(SQLite(), dbname)

将df1添加到数据库

dbWriteTable(con, "test", df1, append=TRUE)

让我们看看已创建的内容

dbListTables(con)
dbListFields(con, "test")

连接数据库

test_db <- src_sqlite(path=dbname)

约会怎么了?

我们失去了格式化,这对后续处理有问题。

tbl(test_db, "test") 

Source:   query [?? x 2]
Database: sqlite 3.11.1 [test.sqlite3]
date           x
<dbl>       <dbl>
  1  -21915 -0.05640646
2  -21914 -0.05640646
3  -21913 -0.05640646
4  -21912 -0.05640646
5  -21911 -0.05640646
6  -21910 -0.05640646
7  -21909 -0.05640646
8  -21908 -0.05640646
9  -21907 -0.05640646
10 -21906 -0.05640646

任何人都可以推荐使用RSQLite时处理日期的策略吗?

1 个答案:

答案 0 :(得分:3)

SQLite中没有日期或时间数据类型。两种可能的方法是将它们保存为文本或整数。我怀疑他们默认情况下会在unix纪元(1970-01-01)之前的几天内存储。

如果您希望将日期作为整数使用,则可以按日期选择:

d <- as.numeric(as.Date("1910-01-04"))
filter(test, date < d)

或转换回日期为日期的tbl:

collect(test) %>% mutate(date = as.Date(date, '1970-01-01'))

您可以将日期存储为文字:

df1$ts <- as.character(df1$date)
dbWriteTable(con, "test", df1, overwrite=TRUE)
tbl(test_db, "test") 

这是您希望的方式的子集:

`filter(test, date < "1910-01-04")`

您还可以转换为普通tbl并将文本转换为日期:

collect(test) %>% mutate(date = as.Date(date))