as.POSIXct/as.POSIXlt不支持.61毫秒。

3

这里有一个奇怪的现象。我正在将成千上万个字符向量转换为日期时间类,就像这样:

alles$DateTime=as.POSIXct(alles$roughdate, tz="EST",format="%Y%m%d.%H%M%S.%OS")

相当简单。字符串(alles$roughdate)的格式为YYYYMMDD.HHMMSS.ss,其中.ss表示毫秒。上述代码按预期工作。但是,如果毫秒数等于.61,则返回NA而不是日期时间值。

这还不算太糟糕,但在处理成千上万个单元格时,总会返回几百个NA。毫秒始终为.61,无论其余日期如何。我确实需要那些日期。

我尝试隔离这些文件,然后再将两个数据框合并在一起,但似乎不起作用。我的所有日期突然都是NA。

有什么想法吗?

例子

vec <- c("20150101.010101.60", "20150101.010101.61", "20150101.010101.62") 
as.POSIXlt(vec, tz="EST", format="%Y%m%d.%H%M%S.%OS")
#[1] "2015-01-01 01:01:60 EST" NA "2015-01-01 01:01:01 EST"

1
看起来你的格式字符串是错误的(如@nrussell的答案所指出的),但出于知识好奇心,我想知道是什么触发了这种特定的未定义行为。不过,我太懒了,不想追踪底层的C代码... - Ben Bolker
1个回答

3
如果您将时间部分的格式更改为%H%M%OS而不是%H%M%S.%OS,则似乎可以正确解析。您可能需要调整您的options
as.POSIXlt(vec, tz = "EST", format = "%Y%m%d.%H%M%OS")
#[1] "2015-01-01 01:01:01 EST" "2015-01-01 01:01:01 EST" 
#[3] "2015-01-01 01:01:01 EST"

options(digits.secs = 2)
as.POSIXlt(vec, tz = "EST", format = "%Y%m%d.%H%M%OS")
# [1] "2015-01-01 01:01:01.60 EST" "2015-01-01 01:01:01.61 EST"
# [3] "2015-01-01 01:01:01.62 EST"

我一直在对那些结果为“NA”的子集进行操作,将这些字符字符串转换为%H%M%S格式的时间戳,然后手动添加0.61。我甚至没有想到要调整选项。我会测试一下,谢谢! - etgriffiths
1
更新:我被这个项目的其他方面分散了注意力,但是建议的选项(digits.secs = 2)并没有解决这个问题。61毫秒仍然很明显。奇怪的是,它可以是610毫秒,从我所看到的来看,代码运行正常。代码中有奇怪的故障。谢谢大家!我已经找到了一个绕路的方法,在后期添加它们,现在它可以工作。 - etgriffiths

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接