首页 > 解决方案 > 如何将纳米时间转换为字符?

问题描述

考虑这个简单的例子

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

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

有没有办法将时间戳正确转换为字符而不会丢失精度?

谢谢!

标签: rdata.tablenanotime

解决方案


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

我们使用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>

推荐阅读