在 R 中将整数转换为日期并使用 sqldf 按日期排序
Convert integer to date in R and sort by date using sqldf
我正在尝试在 R 中加载一个包含 USERID 和日期的数据集。我正在尝试使用 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 中的合并日期函数作为以下查询
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
如有任何帮助,我们将不胜感激。谢谢。
此答案属于评论,但我没有足够的声誉 post 发表评论。
as.POSIXct()
中的格式参数是函数将遇到的格式,而不是最终格式。因此,您首先需要调整对 as.POSIXct()
:
的调用
test$C_DATE <- as.POSIXct(test$C_DATE, format = c("%m/%d/%y %H:%M"))
使用 sqldf 找到最小日期后,您可以使用 format.POSIXct()
重新格式化日期。
希望对您有所帮助。
这是包 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
1) sqlite 问题是 sqlite(默认后端)没有 date/time 类型,因此 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 后端数据库,因为它支持 date/times。如果加载了 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")
我正在尝试在 R 中加载一个包含 USERID 和日期的数据集。我正在尝试使用 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 中的合并日期函数作为以下查询
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
如有任何帮助,我们将不胜感激。谢谢。
此答案属于评论,但我没有足够的声誉 post 发表评论。
as.POSIXct()
中的格式参数是函数将遇到的格式,而不是最终格式。因此,您首先需要调整对 as.POSIXct()
:
test$C_DATE <- as.POSIXct(test$C_DATE, format = c("%m/%d/%y %H:%M"))
使用 sqldf 找到最小日期后,您可以使用 format.POSIXct()
重新格式化日期。
希望对您有所帮助。
这是包 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
1) sqlite 问题是 sqlite(默认后端)没有 date/time 类型,因此 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 后端数据库,因为它支持 date/times。如果加载了 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")