在R中将整数转换为日期,并使用sqldf按日期排序

问题描述 投票:0回答:3

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

我使用posixct转换了日期列,并检查了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中的日期函数作为以下查询

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),即10/11/15 9:05

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

r sqldf
3个回答
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")

0
投票

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

as.POSIXct()中的format参数是函数将遇到的格式,而不是最终格式。所以,你需要先调整as.POSIXct()的调用:

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

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

希望有所帮助。


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
© www.soinside.com 2019 - 2024. All rights reserved.