【发布时间】:2014-11-01 01:47:51
【问题描述】:
我正在读取具有'%d/%m/%Y' 日期格式的巨大文本文件。我想使用 sqldf 的 read.csv.sql 同时按日期读取和过滤数据。这是通过跳过许多我不感兴趣的日期来节省内存使用和运行时间。我知道如何在dplyr 和lubridate 的帮助下做到这一点,但我只想尝试使用sqldf上述原因。尽管我对 SQL 语法非常熟悉,但大部分时间它仍然让我受益匪浅,sqldf 也不例外。
像下面这样的运行命令返回了一个 0 行的 data.frame:
first_date <- "2001-11-1"
second_date <- "2003-11-1"
query <- "select * from file WHERE strftime('%d/%m/%Y', Date, 'unixepoch', 'localtime') between
'$first_date' AND '$second_date'"
df <- read.csv.sql(data_file,
sql= query,
stringsAsFactors=FALSE,
sep = ";", header = TRUE)
所以为了模拟,我尝试了sqldf 函数,如下所示:
first_date <- "2001-11-1"
second_date <- "2003-11-1"
df2 <- data.frame( Date = paste(rep(1:3, each = 4), 11:12, 2001:2012, sep = "/"))
sqldf("SELECT * FROM df2 WHERE strftime('%d/%m/%Y', Date, 'unixepoch') BETWEEN '$first-date' AND '$second_date' ")
# Expect:
# Date
# 1 1-11-2001
# 2 1-12-2002
# 3 1-11-2003
【问题讨论】:
-
你确定文件中的格式不是dd-mm-yyyy吗?通常,如果日或月为 1,则表示为 01 而不是 1。
-
文本文件中的数据确实有这样的日期
1/1/2011,而不是01/01/2011。无论哪种情况,我认为SQLite驱动程序的strftime函数都可以转换为以后的格式。我的困难是我不知道在这种情况下如何测试strftime函数。 -
SQLite 没有日期类型。你可能会发现这个有用:stackoverflow.com/questions/4428795/…
-
@nicola 是的。这就是为什么我使用
strftime函数将时间字符串即时转换为日期并在结果日期上进行比较。我只是不熟悉正确调用的功能。