如何将纳秒转换为字符?

ℕʘʘ*_*ḆḽḘ 0 r nanotime data.table

考虑这个简单的例子

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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,转换nanotime时间戳character(使用strftime)创建第二时间戳的错误毫秒部分:.099代替.100

不幸的是,我需要将时间戳转换为字符串,以便其他编程语言可以吸收它们。

有没有一种方法可以将时间戳正确转换为字符而不会造成精度损失?

谢谢!

Dir*_*tel 5

您在这里有一个基本的误解。

我们之所以使用,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>
Run Code Online (Sandbox Code Playgroud)

  • @ℕʘʘḆḽḘDirk的回答是,您应该使用`format`方法而不是转换为posixct。你想要一年吗?`format(x,format =“%Y”)`。你想要一天吗?`format(x,format =“%d”)`。不需要其他功能。您使用`strftime`吗?您隐式转换为posix并失去了nanotime的优势。 (3认同)