我正在使用令人惊叹的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')"
谢谢!
答案 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
开始使用它。