如何从纳米时间戳中提取年份、tz 转换并获取毫秒部分?
how to extract year, tz-convert and get millisecond part from a nanotime timestamp?
我正在使用令人惊叹的 nanotime
包来存储我宝贵的时间戳。考虑一下:
library(tibble)
library(nanotime)
tibble(mytimestamp = c(nanotime('2011-12-05 08:30:00.000',format ="%Y-%m-%d %H:%M:%E9S", tz ="GMT"),
nanotime('2011-12-05 08:30:00.100',format ="%Y-%m-%d %H:%M:%E9S", tz ="GMT"),
nanotime('2011-12-05 08:30:00.825',format ="%Y-%m-%d %H:%M:%E9S", tz ="GMT")))
# A tibble: 3 x 1
mytimestamp
<S4: nanotime>
1 2011-12-05T08:30:00.000000000+00:00
2 2011-12-05T08:30:00.100000000+00:00
3 2011-12-05T08:30:00.825000000+00:00
但是,我不知道
的正确语法是什么
- 从我的时间戳中提取毫秒部分
- 四舍五入到最接近的秒数(如
lubridate::floor_date(., '1 seconds')
)
- 转换到不同的时区(比如
'US/Eastern'
)
我必须使用另一个包来做这些事情吗?例如,使用 lubridate
将失去毫秒精度(注意 .0999 而不是 .100)
mydf %>%
mutate(lubritime = lubridate::as_datetime(mytimestamp))
# A tibble: 3 x 2
mytimestamp lubritime
<S4: nanotime> <dttm>
1 2011-12-05T08:30:00.000000000+00:00 2011-12-05 08:30:00.00000
2 2011-12-05T08:30:00.100000000+00:00 2011-12-05 08:30:00.09999
3 2011-12-05T08:30:00.825000000+00:00 2011-12-05 08:30:00.82500
同样不允许直接转EST
> mydf %>%
+ mutate(mytimestamp_EST = lubridate::with_tz(mytimestamp, 'US/Eastern'))
Error in UseMethod("reclass_date", orig) :
no applicable method for 'reclass_date' applied to an object of class "c('nanotime', 'integer64', 'oldClass')"
谢谢!
我用 data.table
完成所有这些,因为 众所周知 data.table
支持底层 bit64
包和 integer64
表示 这里需要。其他容器没有。
代码
library(nanotime)
library(data.table)
DT <- data.table(ts = c(nanotime('2011-12-05 08:30:00.000',format ="%Y-%m-%d %H:%M:%E9S", tz ="GMT"),
nanotime('2011-12-05 08:30:00.700',format ="%Y-%m-%d %H:%M:%E9S", tz ="GMT"),
nanotime('2011-12-05 08:30:00.825',format ="%Y-%m-%d %H:%M:%E9S", tz ="GMT")))
DT[, pt := as.POSIXct(ts)]
DT[, millis := as.numeric(pt - trunc(pt)) * 1e3]
结果
R> DT
ts pt millis
1: 2011-12-05T08:30:00.000000000+00:00 2011-12-05 02:30:00.000 0
2: 2011-12-05T08:30:00.700000000+00:00 2011-12-05 02:30:00.700 700
3: 2011-12-05T08:30:00.825000000+00:00 2011-12-05 02:30:00.825 825
R>
时区转换是一个不同的(并且被误解的)话题。你可以做到 POSIXct
.
请注意,您在这里所做的/在这里要求的都是毫秒分辨率。到目前为止,还没有证明 nanotime
的必要性。但是我向您展示的内容可以在纳秒内工作——我从 data.table
.
开始每天都在使用它
我正在使用令人惊叹的 nanotime
包来存储我宝贵的时间戳。考虑一下:
library(tibble)
library(nanotime)
tibble(mytimestamp = c(nanotime('2011-12-05 08:30:00.000',format ="%Y-%m-%d %H:%M:%E9S", tz ="GMT"),
nanotime('2011-12-05 08:30:00.100',format ="%Y-%m-%d %H:%M:%E9S", tz ="GMT"),
nanotime('2011-12-05 08:30:00.825',format ="%Y-%m-%d %H:%M:%E9S", tz ="GMT")))
# A tibble: 3 x 1
mytimestamp
<S4: nanotime>
1 2011-12-05T08:30:00.000000000+00:00
2 2011-12-05T08:30:00.100000000+00:00
3 2011-12-05T08:30:00.825000000+00:00
但是,我不知道
的正确语法是什么- 从我的时间戳中提取毫秒部分
- 四舍五入到最接近的秒数(如
lubridate::floor_date(., '1 seconds')
) - 转换到不同的时区(比如
'US/Eastern'
)
我必须使用另一个包来做这些事情吗?例如,使用 lubridate
将失去毫秒精度(注意 .0999 而不是 .100)
mydf %>%
mutate(lubritime = lubridate::as_datetime(mytimestamp))
# A tibble: 3 x 2
mytimestamp lubritime
<S4: nanotime> <dttm>
1 2011-12-05T08:30:00.000000000+00:00 2011-12-05 08:30:00.00000
2 2011-12-05T08:30:00.100000000+00:00 2011-12-05 08:30:00.09999
3 2011-12-05T08:30:00.825000000+00:00 2011-12-05 08:30:00.82500
同样不允许直接转EST
> mydf %>%
+ mutate(mytimestamp_EST = lubridate::with_tz(mytimestamp, 'US/Eastern'))
Error in UseMethod("reclass_date", orig) :
no applicable method for 'reclass_date' applied to an object of class "c('nanotime', 'integer64', 'oldClass')"
谢谢!
我用 data.table
完成所有这些,因为 众所周知 data.table
支持底层 bit64
包和 integer64
表示 这里需要。其他容器没有。
代码
library(nanotime)
library(data.table)
DT <- data.table(ts = c(nanotime('2011-12-05 08:30:00.000',format ="%Y-%m-%d %H:%M:%E9S", tz ="GMT"),
nanotime('2011-12-05 08:30:00.700',format ="%Y-%m-%d %H:%M:%E9S", tz ="GMT"),
nanotime('2011-12-05 08:30:00.825',format ="%Y-%m-%d %H:%M:%E9S", tz ="GMT")))
DT[, pt := as.POSIXct(ts)]
DT[, millis := as.numeric(pt - trunc(pt)) * 1e3]
结果
R> DT
ts pt millis
1: 2011-12-05T08:30:00.000000000+00:00 2011-12-05 02:30:00.000 0
2: 2011-12-05T08:30:00.700000000+00:00 2011-12-05 02:30:00.700 700
3: 2011-12-05T08:30:00.825000000+00:00 2011-12-05 02:30:00.825 825
R>
时区转换是一个不同的(并且被误解的)话题。你可以做到 POSIXct
.
请注意,您在这里所做的/在这里要求的都是毫秒分辨率。到目前为止,还没有证明 nanotime
的必要性。但是我向您展示的内容可以在纳秒内工作——我从 data.table
.