如何将纳米时间转换为字符?
how to convert a nanotime to character?
考虑这个简单的例子
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
不幸的是,我需要将我的时间戳转换为字符串,以便它们可以被其他编程语言摄取。
有没有办法将时间戳正确转换为字符而不损失精度?
谢谢!
也许这对你有用
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>
你这里有一个基本的误解。
我们使用 nanotime
因为 R 中的标准时间格式只有 (not-quite) 微秒分辨率。所以你在上面使用 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>
考虑这个简单的例子
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
不幸的是,我需要将我的时间戳转换为字符串,以便它们可以被其他编程语言摄取。
有没有办法将时间戳正确转换为字符而不损失精度?
谢谢!
也许这对你有用
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>
你这里有一个基本的误解。
我们使用 nanotime
因为 R 中的标准时间格式只有 (not-quite) 微秒分辨率。所以你在上面使用 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>