具有不一致的夏令时数据的R中as.POSIXct的行为

时间:2018-03-28 13:33:15

标签: r

任何人都可以在R中解释as.POSIXct的这种行为。

ts <- c("2018-03-24 23:00:00", "2018-03-25 01:00:00", "2018-03-25 01:15:00", 
        "2018-03-25 01:30:00", "2018-03-25 01:45:00", "2018-03-25 02:00:00")

as.POSIXct(ts)
as.POSIXct(ts[1:5])

diff(as.POSIXct(ts))
diff(as.POSIXct(ts[1:5]))

在RStudio中运行交互式时的结果是:

> as.POSIXct(ts)
[1] "2018-03-24 CET" "2018-03-25 CET" "2018-03-25 CET" "2018-03-25 CET" "2018-03-25 CET" "2018-03-25 CET"
> as.POSIXct(ts[1:5])
[1] "2018-03-24 23:00:00 CET" "2018-03-25 01:00:00 CET" "2018-03-25 01:15:00 CET" "2018-03-25 01:30:00 CET" "2018-03-25 01:45:00 CET"
> 
> diff(as.POSIXct(ts))
Time differences in secs
[1] 86400     0     0     0     0
> diff(as.POSIXct(ts[1:5]))
Time differences in mins
[1] 120  15  15  15
> ts[1:5]
[1] "2018-03-24 23:00:00" "2018-03-25 01:00:00" "2018-03-25 01:15:00" "2018-03-25 01:30:00" "2018-03-25 01:45:00"
> ts
[1] "2018-03-24 23:00:00" "2018-03-25 01:00:00" "2018-03-25 01:15:00" "2018-03-25 01:30:00" "2018-03-25 01:45:00" "2018-03-25 02:00:00"

第一次观察;当查看所有6个数据时,“时间”条目消失。这只是打印输出现象吗? 第二个观察,差异的行为似乎完全离奇。

2 个答案:

答案 0 :(得分:1)

问题不在于String createTable = """create table if not exists ${schema.name} ( |${schema.fields.collect { " ${it.name.padRight(39)} ${typeMap[it.type.items]}" }.join(',\n')} |)""".stripMargin() 功能。它与diff结合DST(夏令时)。 R不会自动处理。

2017年3月25日,2018 02:00:00。 CET设定为1小时,正式改为CEST时间。这意味着2018-03-25 02:00:00 CET根本就不存在。

为什么会这样?

调用as.POSIX*时,某些参数设置为默认值。其中一个是系统默认设置的as.POSIXct()(时区)(我的是CET)。

为了澄清,我编辑了你的数据集

tz

现在我们运行以下行

ts <- c("2018-03-25 01:45:00", "2018-03-25 02:00:00", "2018-03-25 03:00:00")

没有给出格式参数,因此R将尝试不同的格式,从而导致删除时间戳。那么如果我们强制使用带有时间戳的格式呢?运行以下行将导致:

as.POSIXct(ts)
#"2018-03-25 CET" "2018-03-25 CET" "2018-03-25 CET"

请注意,第二个值(实际上不存在的时间)被强制为NA。由于R无法将此值转换为as.POSIXct(ts, format = "%Y-%m-%d %H:%M:%OS") # "2018-03-25 01:45:00 CET" NA "2018-03-25 03:00:00 CEST" ,因此它会尝试更简单的格式("%Y-%m-%d %H:%M:%OS")。另请注意,第三个值位于CEST时区,传递DST时间。通过给定不同时区的转换调用运行集合,代码成功:

"%Y-%m-%d"

答案 1 :(得分:0)

简而言之,由于夏季问题,CET中没有“2018-03-25 02:00:00”。

具体而言,as.POSIXct函数具有tryFormats参数,它应用format函数将character转换为POSIXct类。

由于无法将“2018-03-25 02:00:00”转换为POSIXct类,因此该函数使用%Y-%m-%d格式,而不是%Y-%m-%d %H:%M:%OS

如果你尝试另一个没有夏令时的时区,例如Asia/Seoul,然后您会看到他们会一直显示日期时间格式。

Sys.setenv(TZ='Asia/Seoul')
as.POSIXct(ts)
> [1] "2018-03-24 23:00:00 KST" "2018-03-25 01:00:00 KST" "2018-03-25 01:15:00 KST" "2018-03-25 01:30:00 KST" "2018-03-25 01:45:00 KST" "2018-03-25 02:00:00 KST"