如何从纳米时间戳中提取年份、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 将失去毫秒精度(注意 .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.

开始每天都在使用它