润滑 as_date 和。 as_date行为的时间差异
Lubridate as_date and. as_datetime differences in behavior
我有一个数字向量,表示自 1970 年 1 月 1 日以来的毫秒数。我想使用 lubridate
将它们转换为日期时间对象。数据示例如下:
raw_times <- c(1139689917479, 1139667123031, 1140364113915, 1140364951003,
1139643685434, 1139677091970, 1139691963511, 1140339448413, 1140368308429,
1139686613641, 1139666081813, 1140351488730, 1140346617958, 1141933663183,
1141933207579, 1140360125149, 1140351845108, 1140365079103, 1141933549825,
1140365601476)
知道 as_date
和 as_datetime
的文档表明它们采用表示自 1970 年 1 月 1 日以来 天 的数字向量,我尝试了以下:
library(lubridate)
as_date(raw_times / (1000 * 60 * 60 * 24))
"2006-02-11" "2006-02-11" "2006-02-19" "2006-02-19" "2006-02-11"
"2006-02-11" "2006-02-11" "2006-02-19" "2006-02-19" "2006-02-11"
"2006-02-11" "2006-02-19" "2006-02-19" "2006-03-09" "2006-03-09"
"2006-02-19" "2006-02-19" "2006-02-19" "2006-03-09" "2006-02-19"
(很明显是利用了一秒有1000毫秒,一分钟有60秒,一小时有60分钟,一天有24小时。)
当我 运行 与 as_datetime
相同的代码时,我得到以下信息:
as_datetime(raw_times / (1000 * 60 * 60 * 24))
"1970-01-01 03:39:50 UTC" "1970-01-01 03:39:50 UTC" "1970-01-01 03:39:58 UTC" "1970-01-01 03:39:58 UTC" "1970-01-01 03:39:50 UTC" "1970-01-01 03:39:50 UTC"
"1970-01-01 03:39:50 UTC" "1970-01-01 03:39:58 UTC" "1970-01-01 03:39:58 UTC" "1970-01-01 03:39:50 UTC" "1970-01-01 03:39:50 UTC" "1970-01-01 03:39:58 UTC"
"1970-01-01 03:39:58 UTC" "1970-01-01 03:40:16 UTC" "1970-01-01 03:40:16 UTC" "1970-01-01 03:39:58 UTC" "1970-01-01 03:39:58 UTC" "1970-01-01 03:39:58 UTC"
"1970-01-01 03:40:16 UTC" "1970-01-01 03:39:58 UTC"
结果不同。我假设还有其他一些我遗漏的论点,但我在文档中找不到任何可以告诉我那是什么的东西。
以下会话信息:
> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] lubridate_1.6.0
loaded via a namespace (and not attached):
[1] magrittr_1.5 tools_3.3.2 stringi_1.1.2 stringr_1.1.0
不是(已编辑包名称)解决方案,但您可以使用 base::.POSIXct
:
R> options(digits.secs=3)
R> .POSIXct(raw_times/1000)
[1] "2006-02-11 14:31:57.479 CST" "2006-02-11 08:12:03.030 CST"
[3] "2006-02-19 09:48:33.914 CST" "2006-02-19 10:02:31.003 CST"
[5] "2006-02-11 01:41:25.434 CST" "2006-02-11 10:58:11.970 CST"
[7] "2006-02-11 15:06:03.510 CST" "2006-02-19 02:57:28.413 CST"
[9] "2006-02-19 10:58:28.428 CST" "2006-02-11 13:36:53.641 CST"
[11] "2006-02-11 07:54:41.812 CST" "2006-02-19 06:18:08.730 CST"
[13] "2006-02-19 04:56:57.957 CST" "2006-03-09 13:47:43.183 CST"
[15] "2006-03-09 13:40:07.578 CST" "2006-02-19 08:42:05.148 CST"
[17] "2006-02-19 06:24:05.108 CST" "2006-02-19 10:04:39.102 CST"
[19] "2006-03-09 13:45:49.825 CST" "2006-02-19 10:13:21.476 CST"
另一种解决方案是使用相对较新的 anytime 包,其任务是将 anything 转换为正确的 Date
或 POSIXct
对象最小的模糊或输入。
anytime()
也需要(适当缩放的)自纪元以来的秒数:
R> raw_times <- c(1139689917479, 1139667123031, 1140364113915,
+ 1140364951003, 1139643685434, 1139677091970,
+ 1139691963511, 1140339448413, 1140368308429,
+ 1139686613641, 1139666081813, 1140351488730,
+ 1140346617958, 1141933663183, 1141933207579,
+ 1140360125149, 1140351845108, 1140365079103,
+ 1141933549825, 1140365601476)
R> scaled_times <- raw_times / 1000
R> library(anytime)
R> options(digits.secs=6) # subsecond display
R> anytime(scaled_times)
[1] "2006-02-11 14:31:57.479 CST"
[2] "2006-02-11 08:12:03.030 CST"
[3] "2006-02-19 09:48:33.914 CST"
[4] "2006-02-19 10:02:31.003 CST"
[5] "2006-02-11 01:41:25.434 CST"
[6] "2006-02-11 10:58:11.970 CST"
[7] "2006-02-11 15:06:03.510 CST"
[8] "2006-02-19 02:57:28.413 CST"
[9] "2006-02-19 10:58:28.428 CST"
[10] "2006-02-11 13:36:53.641 CST"
[11] "2006-02-11 07:54:41.812 CST"
[12] "2006-02-19 06:18:08.730 CST"
[13] "2006-02-19 04:56:57.957 CST"
[14] "2006-03-09 13:47:43.183 CST"
[15] "2006-03-09 13:40:07.578 CST"
[16] "2006-02-19 08:42:05.148 CST"
[17] "2006-02-19 06:24:05.108 CST"
[18] "2006-02-19 10:04:39.102 CST"
[19] "2006-03-09 13:45:49.825 CST"
[20] "2006-02-19 10:13:21.476 CST"
R>
使用 anytime()
有点矫枉过正(正如 Josh 所展示的),但话又说回来,使用 exposed 函数而不是隐藏的基函数可能更可取。 anytime()
通过不要求来源(一次又一次)赢得了官方 as.POSIXct()
。
我有一个数字向量,表示自 1970 年 1 月 1 日以来的毫秒数。我想使用 lubridate
将它们转换为日期时间对象。数据示例如下:
raw_times <- c(1139689917479, 1139667123031, 1140364113915, 1140364951003,
1139643685434, 1139677091970, 1139691963511, 1140339448413, 1140368308429,
1139686613641, 1139666081813, 1140351488730, 1140346617958, 1141933663183,
1141933207579, 1140360125149, 1140351845108, 1140365079103, 1141933549825,
1140365601476)
知道 as_date
和 as_datetime
的文档表明它们采用表示自 1970 年 1 月 1 日以来 天 的数字向量,我尝试了以下:
library(lubridate)
as_date(raw_times / (1000 * 60 * 60 * 24))
"2006-02-11" "2006-02-11" "2006-02-19" "2006-02-19" "2006-02-11"
"2006-02-11" "2006-02-11" "2006-02-19" "2006-02-19" "2006-02-11"
"2006-02-11" "2006-02-19" "2006-02-19" "2006-03-09" "2006-03-09"
"2006-02-19" "2006-02-19" "2006-02-19" "2006-03-09" "2006-02-19"
(很明显是利用了一秒有1000毫秒,一分钟有60秒,一小时有60分钟,一天有24小时。)
当我 运行 与 as_datetime
相同的代码时,我得到以下信息:
as_datetime(raw_times / (1000 * 60 * 60 * 24))
"1970-01-01 03:39:50 UTC" "1970-01-01 03:39:50 UTC" "1970-01-01 03:39:58 UTC" "1970-01-01 03:39:58 UTC" "1970-01-01 03:39:50 UTC" "1970-01-01 03:39:50 UTC"
"1970-01-01 03:39:50 UTC" "1970-01-01 03:39:58 UTC" "1970-01-01 03:39:58 UTC" "1970-01-01 03:39:50 UTC" "1970-01-01 03:39:50 UTC" "1970-01-01 03:39:58 UTC"
"1970-01-01 03:39:58 UTC" "1970-01-01 03:40:16 UTC" "1970-01-01 03:40:16 UTC" "1970-01-01 03:39:58 UTC" "1970-01-01 03:39:58 UTC" "1970-01-01 03:39:58 UTC"
"1970-01-01 03:40:16 UTC" "1970-01-01 03:39:58 UTC"
结果不同。我假设还有其他一些我遗漏的论点,但我在文档中找不到任何可以告诉我那是什么的东西。
以下会话信息:
> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] lubridate_1.6.0
loaded via a namespace (and not attached):
[1] magrittr_1.5 tools_3.3.2 stringi_1.1.2 stringr_1.1.0
不是(已编辑包名称)解决方案,但您可以使用 base::.POSIXct
:
R> options(digits.secs=3)
R> .POSIXct(raw_times/1000)
[1] "2006-02-11 14:31:57.479 CST" "2006-02-11 08:12:03.030 CST"
[3] "2006-02-19 09:48:33.914 CST" "2006-02-19 10:02:31.003 CST"
[5] "2006-02-11 01:41:25.434 CST" "2006-02-11 10:58:11.970 CST"
[7] "2006-02-11 15:06:03.510 CST" "2006-02-19 02:57:28.413 CST"
[9] "2006-02-19 10:58:28.428 CST" "2006-02-11 13:36:53.641 CST"
[11] "2006-02-11 07:54:41.812 CST" "2006-02-19 06:18:08.730 CST"
[13] "2006-02-19 04:56:57.957 CST" "2006-03-09 13:47:43.183 CST"
[15] "2006-03-09 13:40:07.578 CST" "2006-02-19 08:42:05.148 CST"
[17] "2006-02-19 06:24:05.108 CST" "2006-02-19 10:04:39.102 CST"
[19] "2006-03-09 13:45:49.825 CST" "2006-02-19 10:13:21.476 CST"
另一种解决方案是使用相对较新的 anytime 包,其任务是将 anything 转换为正确的 Date
或 POSIXct
对象最小的模糊或输入。
anytime()
也需要(适当缩放的)自纪元以来的秒数:
R> raw_times <- c(1139689917479, 1139667123031, 1140364113915,
+ 1140364951003, 1139643685434, 1139677091970,
+ 1139691963511, 1140339448413, 1140368308429,
+ 1139686613641, 1139666081813, 1140351488730,
+ 1140346617958, 1141933663183, 1141933207579,
+ 1140360125149, 1140351845108, 1140365079103,
+ 1141933549825, 1140365601476)
R> scaled_times <- raw_times / 1000
R> library(anytime)
R> options(digits.secs=6) # subsecond display
R> anytime(scaled_times)
[1] "2006-02-11 14:31:57.479 CST"
[2] "2006-02-11 08:12:03.030 CST"
[3] "2006-02-19 09:48:33.914 CST"
[4] "2006-02-19 10:02:31.003 CST"
[5] "2006-02-11 01:41:25.434 CST"
[6] "2006-02-11 10:58:11.970 CST"
[7] "2006-02-11 15:06:03.510 CST"
[8] "2006-02-19 02:57:28.413 CST"
[9] "2006-02-19 10:58:28.428 CST"
[10] "2006-02-11 13:36:53.641 CST"
[11] "2006-02-11 07:54:41.812 CST"
[12] "2006-02-19 06:18:08.730 CST"
[13] "2006-02-19 04:56:57.957 CST"
[14] "2006-03-09 13:47:43.183 CST"
[15] "2006-03-09 13:40:07.578 CST"
[16] "2006-02-19 08:42:05.148 CST"
[17] "2006-02-19 06:24:05.108 CST"
[18] "2006-02-19 10:04:39.102 CST"
[19] "2006-03-09 13:45:49.825 CST"
[20] "2006-02-19 10:13:21.476 CST"
R>
使用 anytime()
有点矫枉过正(正如 Josh 所展示的),但话又说回来,使用 exposed 函数而不是隐藏的基函数可能更可取。 anytime()
通过不要求来源(一次又一次)赢得了官方 as.POSIXct()
。