SQLite 不使用 R 中的数据框报告正确的工作日

SQLite doesn't report correct weekday with dataframe in R

我正在尝试计算每个工作日在数据框中出现的次数。在屏幕上打印时,我的数据框看起来像这样(假设列标记为 "x")

我目前正在使用

sqldf("SELECT x, strftime('%w', x) FROM maxkwpeakdates")

此外,如果我 运行 代码

sqldf("SELECT strftime('%w', date('now'))")

我得到正确的工作日。

知道 strftime 来自 sqlite 并且它们的日期时间函数是基于 0 的,这些数字是关闭的。查看第一行,结果应该是 3,因为 2011 年 4 月 6 日发生在星期三。第 10 行的结果也应该是 3,因为 2012 年 1 月 4 日也发生在星期三。

我的数据实际上存储在闪亮的应用程序中的数据框中,这就是为什么我不使用 RMySQL 之类的东西而是使用 sqldf 的原因。我希望能够 运行 SQL 查询我的数据框,这样我就可以将数据保存在应用程序中,这样我就可以计算某个时间段内特定工作日的平均数量。这是我的数据框示例,称为 maxkwpeakdates:

我用我的数据做了另一个测试并比较了使用

的结果

sqldf("SELECT x, strftime('%w', x) FROM maxkwpeakdates")

weekdays(as.Date(maxkwpeakdates$x))

然后我将这些结果存储在一个数据框中,这样我就可以比较结果。

请注意,使用 as.Date 报告正确的工作日,但使用 strftime 几乎总是关闭。这是 R 通过 strftime 与 sqlite 对话的问题吗?有没有办法解决这个问题,以便我使用 strftime 得到正确的结果?

1) SQLite SQLite 没有任何 date/time 类型所以 R 所做的只是发送内部表示,秒从 Epoch 开始,到 SQLite,然后由 SQL 语句以某种方式解释它。 SQLite 确实有日期时间函数,但它们不假定 R 的内部表示,并且需要像这样进行转换:

dd <- data.frame(now = Sys.time()) # test data
dd
##                   now
## 1 2017-03-29 07:39:30

format(dd$now, "%A") # check
## [1] "Wednesday"


sqldf("select strftime('%w', now, 'unixepoch', 'localtime') dayno from dd")
##   dayno
## 1     3

2) H2 一个更简单的替代方法是使用 H2 数据库后端到 sqldf。如果加载 RH2 包,sqldf 将默认使用它。 H2 确实具有真正的日期和日期时间类型,使此类对象的操作更加容易。

library(RH2)
library(sqldf)

sqldf("select day_of_week(now)-1 dayno, dayname(now) dayname from dd")
##   dayno   dayname
## 1     3 Wednesday