【问题标题】:Convert integer to date in R and sort by date using sqldf在R中将整数转换为日期并使用sqldf按日期排序
【发布时间】:2019-04-09 01:24:31
【问题描述】:

我正在尝试在 R 中加载具有 USERID 和日期的数据集。我正在尝试使用 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

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

【问题讨论】:

  • 能否提供样本数据?可以使用dput(your data) 并粘贴到这里。
  • 我现在已经在问题中添加了示例数据。谢谢

标签: r sqldf


【解决方案1】:

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")

【讨论】:

  • 实际上列名起到了作用。当我加入多个表时,RH2 包需要很长时间来计算。有什么你可能知道的原因吗?
  • 第一次在会话中使用 java 时,它必须加载 java,这需要很长时间,也许这就是您所观察到的。试两次。如果确实需要很长时间,您可以尝试向表中添加索引或使用不同的后端。
  • 我试了几次,但还是需要很长时间。也许添加索引会起作用 - 感谢您的提示。!
【解决方案2】:

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

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

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

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

希望对您有所帮助。

【讨论】:

  • 我尝试更改 POSIXct 中的格式,但由于某种原因,我仍然得到日期和格式错误。
【解决方案3】:

这里是 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

【讨论】:

  • 感谢您的解决方案,但我在 sqlf 中需要它。
猜你喜欢
  • 2019-08-05
  • 2015-05-31
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
相关资源
最近更新 更多