R如何用小数秒格式化POSIXct
我认为R错误地使用小数秒格式化POSIXct类型。我通过R-bugs作为增强请求提交了这个,并且“我们认为当前的行为是正确的 - 删除了bug”。虽然我非常感谢他们已经完成并将继续做的工作,但我想让其他人对这个特定问题采取行动,并且可能就如何更有效地提出要点提出建议。
这是一个例子:
> tt <- as.POSIXct('2011-10-11 07:49:36.3') > strftime(tt,'%Y-%m-%d %H:%M:%OS1') [1] "2011-10-11 07:49:36.2"
也就是说,tt被创建为POSIXct时间,小数部分.3秒。当使用一个十进制数字打印时,显示的值为.2。我使用毫秒级精度的时间戳工作很多,这让我很烦恼,因为时间通常比实际值低一个等级。
以下是发生的事情:POSIXct是自纪元以来的浮点秒数。精确处理所有整数值,但在base-2浮点中,与.3最接近的值略小于.3。strftime()
格式的所述行为%OSn
是向下舍入到请求的小数位数,因此显示的结果为.2。对于其他小数部分,浮点值略高于输入的值,显示屏给出预期结果:
> tt <- as.POSIXct('2011-10-11 07:49:36.4') > strftime(tt,'%Y-%m-%d %H:%M:%OS1') [1] "2011-10-11 07:49:36.4"
开发人员的论点是,对于时间类型,我们应该总是向下舍入到请求的精度。例如,如果时间是11:59:59.8,那么用格式打印它%H:%M
应该给出“11:59”而不是“12:00”,并且%H:%M:%S
应该给出“11:59:59”而不是“12:00:00”。我同意这个整数秒和格式标志%S
,但我认为对于为秒的小数部分设计的格式标志,行为应该是不同的。我希望看到%OSn
使用舍入到最近的行为,即使是n = 0
同时%S
使用循环下来,从而使打印11:59:59.8与格式%H:%M:%OS0
会给“12:00:00”。这不会影响整数秒的任何事情,因为它们总是精确地表示,但它会更自然地处理小数秒的舍入误差。
这就是如何处理小数部分的打印,例如C,因为整数转换向下舍入:
double x = 9.97; printf("%d\n",(int) x); // 9 printf("%.0f\n",x); // 10 printf("%.1f\n",x); // 10.0 printf("%.2f\n",x); // 9.97
我做了一个关于如何在其他语言和环境中处理小数秒的快速调查,并且似乎确实没有达成共识。大多数构造设计为整数秒,而小数部分是事后想法。在我看来,在这种情况下,R开发人员做出的选择并非完全不合理,但实际上并不是最好的选择,并且与其他地方用于显示浮点数的约定不一致。
人们的想法是什么?R行为是否正确?这是你自己设计它的方式吗?
慕尼黑8549860