R语言 在sqldf中将整数值转换为日期时间

6ie5vjzr  于 2023-02-20  发布在  其他
关注(0)|答案(3)|浏览(128)

我使用sqldf库返回一个具有不同值的数据框,并且只返回日期列的最大值。

+------+----------+--------+-----------------+
| NAME |   val1   |  val2  |      DATE       |
+------+----------+--------+-----------------+
| A    |  23.7228 | 0.5829 | 11/19/2014 8:17 |
| A    |  23.7228 | 0.5829 | 11/12/2014 8:16 |
+------+----------+--------+-----------------+

当我尝试运行下面的代码以获取具有最大日期的非重复值时

df <-  sqldf("SELECT DISTINCT NAME, val1, val2, MAX(DATE) FROM Table")

我得到这个作为输出。

+------+----------+--------+-----------------+
| NAME |   val1   |  val2  | MAX(DATE)       |
+------+----------+--------+-----------------+
| A    |  23.7228 | 0.5829 | 1416406625      |
+------+----------+--------+-----------------+

请让我知道我如何转换最后一列,这是一个整数,以恢复我的日期时间格式。

hgqdbh6s

hgqdbh6s1#

下一次请提供您的输入在可复制的形式。我已经这样做了这一次为您下面。此外,SQL代码中的问题有一个SQLite语法错误,我已经修复如下。
最简单的方法是使用名称DATE作为输出列,在这种情况下,sqldf将认为它与DATE输入列的类型相同。SQLite没有日期和时间类型,因此在将sqldf与SQLite一起使用时,sqldf无法知道返回的是日期时间。sqldf使用一些启发式方法来猜测,如刚才讨论的方法。

library(sqldf)

Lines <- "NAME,val1,val2,DATE     
A,23.7228,0.5829,11/19/2014 8:17 
A,23.7228,0.5829,11/12/2014 8:16"

Table <- read.csv(text = Lines, as.is = TRUE)
Table$DATE <- as.POSIXct(Table$DATE, format = "%m/%d/%Y %H:%M")

sqldf("SELECT DISTINCT NAME, val1, val2, MAX(DATE) DATE FROM 'Table'")

给出:

NAME    val1   val2                DATE
1     A 23.7228 0.5829 2014-11-19 08:17:00

如果我们将H2与sqldf一起使用,那么我们就不会有这些问题,因为H2确实支持日期和时间类型,因此sqldf不必猜测。此外,SQL查询的语法与H2中的语法相同。使用上面所示的Table数据框架:

library(RH2)
library(sqldf)

sqldf("SELECT DISTINCT NAME, val1, val2, MAX(DATE) DATE FROM Table")

给出:

NAME    val1   val2           MAX(DATE)
1     A 23.7228 0.5829 2014-11-19 08:17:00
zwghvu4y

zwghvu4y2#

试试看:

> as.POSIXct(1416406625, origin = "1970-01-01", tz = "GMT")
[1] "2014-11-19 14:17:05 GMT"

您可能需要更改时区(tz)以获得正确的时间。

6gpjuf90

6gpjuf903#

我更喜欢使用一点变通方法来确保我的日期在通过sqldf时保持日期。
下面的伪代码将说服sqldf在对其应用函数后将您的日期作为日期返回:
日期(某些函数(日期字段)* 86400,'unixepoch')

日期时间(某些函数(日期字段)* 86400,“unixepoch”)
基本上,当您对日期应用函数时,sqldf会将日期转换为Unix时间版本中该日期的数字表示形式,但不会麻烦地将其转换回来。(天)与DATE/DATETIME函数使用的值不同(秒)。因此,您必须通过将sqldf提供的数字乘以一天中的秒数(86400)来转换它们,然后您就得到了正确的Unix时间。
在特定情况下(将DATE更改为date_field以避免与函数名混淆):
df〈- sqldf(“从表中选择不同名称,值1,值2,日期时间(最大值(日期字段)* 86400,'unixepoch')”)
它会让SQL变得笨拙,但却可以为您节省一些更笨拙的R代码。还有其他的好处,比如让SQL更健壮和可重用。此外,R有一个坏习惯,那就是改变您的数据类型,这可能会很快赶上您,因此一有机会就将其扼杀在萌芽状态是一个好主意。

相关问题