将整数转换为R中的日期,并使用sqldf

时间:2019-04-09 01:24:32

标签: r sqldf

我正在尝试在R中加载具有USERID和Date的数据集。我正在尝试使用sqldf为用户ID提取MIN(DATE),但结果似乎有问题。

我使用posixct转换了date列,并检查了typeof列,结果显示为double(转换前为整数)

test$C_DATE <- as.POSIXct(test$C_DATE, format = c("%m-%d-%Y %H:%M"))
minDate <- sqldf("SELECT U_ID,MIN(C_DATE) AS FTrans FROM test WHERE U_ID = 'ABC' GROUP BY U_ID")

预期输出应为

U_ID FTrans
ABC  12/20/2017  5:00:47 PM

但是我得到

U_ID FTrans
ABC  1507631400

我尝试在SQL中使用不匹配的date函数作为以下查询

minDate <- sqldf("SELECT U_ID,DATE(MIN(C_DATE),'unixepoch','localtime') AS FTrans FROM test WHERE U_ID = 'ABC' GROUP BY U_ID")

但是我得到了错误的日期和格式错误的结果。

U_ID FTrans
ABC  2017-10-10

样本数据

UID    C_DATE
ABC    10/11/15 9:05
ABC    10/11/15 20:08
DEF    10/11/15 11:37
GHI    10/11/15 20:08
JKL    10/11/15 2:46

理想情况下,我希望用户ABC第一次记录数据(MIN DATE),即2015年10月11日9:05

任何帮助将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:0)

此答案属于评论,但我没有足够的声誉来发表评论。

as.POSIXct()中的format参数是函数将要遇到的格式,而不是最终格式。因此,您需要首先调整对as.POSIXct()的呼叫:

test$C_DATE <- as.POSIXct(test$C_DATE, format = c("%m/%d/%y %H:%M"))

使用sqldf查找最短日期后,可以使用format.POSIXct()重新格式化日期。

希望有帮助。

答案 1 :(得分:0)

这是软件包library(tidyverse)

的解决方案
> test %>% 
+   group_by(UID) %>% 
+   summarize(mindate = min(C_DATE))
# A tibble: 4 x 2
  UID   mindate            
  <chr> <dttm>             
1 ABC   2015-10-11 09:05:00
2 DEF   2015-10-11 11:37:00
3 GHI   2015-10-11 20:08:00
4 JKL   2015-10-11 02:46:00

答案 2 :(得分:0)

1)sqlite 问题是sqlite(默认后端)没有日期/时间类型,因此POSIXct值作为原始数字发送和返回。无法确定是否知道从sqlite返回的数字是否应该表示POSIXct值,但是sqldf所做的只是基于其名称的猜测。由于C_DATE在输入中为POSIXct,因此它将假定返回的任何C_DATE列都应转换为POSIXct,因此只需使用C_DATE作为列名而不是FTrans。最后使用注释中可重复显示的数据,我们使用:

library(sqldf)
test$C_DATE <- as.POSIXct(test$C_DATE, format = "%m/%d/%y %H:%M")

sqldf("SELECT UID, MIN(C_DATE) AS C_DATE
  FROM test 
  WHERE UID = 'ABC' 
  GROUP BY UID")

给予:

  UID              C_DATE
1 ABC 2015-10-11 09:05:00

如果您阅读?sqldf,还有其他方法可以告诉sqldf列类型。

2)h2 处理此问题的另一种方法是使用h2后端数据库,因为它确实支持日期/时间。如果RH2驱动程序已加载,则sqldf会注意到它,并改用该数据库后端。该问题与问题相同,只不过它使用正确的列名。和以前一样,我们在下面的注释中使用test

library(RH2)
library(sqldf)

sqldf("SELECT UID, MIN(C_DATE) AS FTrans 
  FROM test 
  WHERE UID = 'ABC' 
  GROUP BY UID")

给予:

  UID              FTrans
1 ABC 2015-10-11 09:05:00

注意

Lines <- "UID,C_DATE
ABC,10/11/15 9:05
ABC,10/11/15 20:08
DEF,10/11/15 11:37
GHI,10/11/15 20:08
JKL,10/11/15 2:46"
test <- read.csv(text = Lines, strip.white = TRUE)
test$C_DATE <- as.POSIXct(test$C_DATE, format = "%m/%d/%y %H:%M")