как конвертировать нанотайм в символ? - PullRequest
0 голосов
/ 21 мая 2019

Рассмотрим этот простой пример

DT <- data.table::data.table(mytime =  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")))
#convert the timestamp to string
DT[, mytime_character := strftime(mytime, format = '%Y-%m-%d %H:%M:%OS3')]

> DT
                                mytime        mytime_character
1: 2011-12-05T08:30:00.000000000+00:00 2011-12-05 03:30:00.000
2: 2011-12-05T08:30:00.100000000+00:00 2011-12-05 03:30:00.099
3: 2011-12-05T08:30:00.825000000+00:00 2011-12-05 03:30:00.825

Как видите, преобразование метки времени nanotime в character (с использованием strftime) создает неправильную миллисекундную часть для второй метки времени: .099вместо .100

К сожалению, мне нужно преобразовать свои метки времени в строку, чтобы они могли быть приняты другими языками программирования.

Есть ли способ правильно преобразовать метки времени в символы безпотеря точности?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 21 мая 2019

У вас здесь элементарное недопонимание.

Мы используем nanotime , потому что стандартные форматы времени в R имеют только (не совсем) разрешение в микросекундах .Таким образом, используя strftime(), вы делаете это неправильно.

Но nanotime, будучи подходящим пакетом, , конечно, имеет метод format():

R> DT <- data.table::data.table(mt = 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")))
R> 
R> DT[, fmt := format(mt)]
R> DT[]
                                    mt                                 fmt
1: 2011-12-05T08:30:00.000000000+00:00 2011-12-05T08:30:00.000000000+00:00
2: 2011-12-05T08:30:00.100000000+00:00 2011-12-05T08:30:00.100000000+00:00
3: 2011-12-05T08:30:00.825000000+00:00 2011-12-05T08:30:00.825000000+00:00
R>
1 голос
/ 21 мая 2019

Может быть, это работает для вас

DT[, mytime_character := format(mytime)]
DT %>% str()

> DT %>% str()
Classes ‘data.table’ and 'data.frame':  3 obs. of  2 variables:
 $ mytime          :integer64 1323073800000000000 1323073800100000000 1323073800825000000 
 $ mytime_character: chr  "2011-12-05T08:30:00.000000000+00:00" "2011-12-05T08:30:00.100000000+00:00" "2011-12-05T08:30:00.825000000+00:00"
 - attr(*, ".internal.selfref")=<externalptr> 
...