任何人都可以在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个数据时,“时间”条目消失。这只是打印输出现象吗? 第二个观察,差异的行为似乎完全离奇。
答案 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"