如何从纳秒级时间戳中提取年份,tz转换并获得毫秒部分?

时间:2019-05-21 14:38:43

标签: r datetime lubridate nanotime

我正在使用令人惊叹的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')"

谢谢!

1 个答案:

答案 0 :(得分:1)

我使用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开始使用它。