在R语言中使用int64类型nanotime作为数组dimnames的问题
解决nanotime对象作为数组dimnames时的类型转换问题
这个问题我之前也碰到过!核心原因是nanotime本质是带有特殊属性的int64类型,当你直接把它赋值给dimnames时,R会自动剥离它的属性,把底层的int64数值当成普通浮点数转换,就出现了你看到的那些奇怪的科学计数法字符串,自然没法转回有效的nanotime。
解决方法很简单,只需要先把nanotime显式转换为它的ISO格式字符表示,再赋值给dimnames就行,具体步骤如下:
步骤1:将nanotime转为正确的字符格式
用as.character()函数可以直接得到nanotime对应的ISO标准时间字符串,这个字符串是可以正确转回nanotime的。
步骤2:赋值给数组的dimnames
直接把转换后的字符向量放到dimnames的list里即可,注意不要直接用原nanotime对象赋值。
完整示例代码:
library(nanotime) # 你的nanotime对象 mynames <- nanotime(c("2020-04-15T00:29:00.000000000+00:00", "2020-04-15T00:33:00.000000000+00:00")) # 创建目标数组 a <- array(NA, dim = c(2, 2)) # 正确的赋值方式:先转字符再赋值 dimnames(a)[[1]] <- as.character(mynames) # 查看结果 print(a) #> [,1] [,2] #> 2020-04-15T00:29:00+00:00 NA NA #> 2020-04-15T00:33:00+00:00 NA NA # 验证可以转回nanotime print(nanotime(dimnames(a)[[1]][1])) #> [1] 2020-04-15T00:29:00+00:00
为什么之前的方法会出错?
你之前用dimnames(a)[1] <- list(values=mynames)赋值时,R会把list里的nanotime对象自动转换为它底层的int64数值(而不是保留它的字符表示),然后把这个数值转成了科学计数法的字符串,这就导致后续无法转回有效的nanotime了。
另外,也可以用更简洁的方式直接设置dimnames:
dimnames(a) <- list(as.character(mynames), NULL)
这样就能完美保留你需要的时间字符串作为dimnames,同时还能随时转回nanotime对象。
内容的提问来源于stack exchange,提问作者Mittenchops
相关产品推荐
相关产品推荐

