我正在尝试计算数据帧中每个工作日发生的次数。我的数据框在屏幕上打印时看起来像这样(假设列标有" 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得到了正确的结果?
答案 0 :(得分:1)
1)SQLite SQLite没有任何日期/时间类型,因此所有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