Как R форматирует POSIXct с долями секунды

Я считаю, что R неправильно форматирует типы POSIXct с долями секунды. Я отправил это через R-bugs в качестве запроса на усовершенствование, и меня отмахнули словами: «Мы считаем, что текущее поведение правильное - ошибка удалена». Хотя я очень признателен за работу, которую они проделали и продолжают делать, я хотел, чтобы другие народы взялись за этот конкретный вопрос, и, возможно, за советы, как сделать это более эффективно.

Вот пример:

 > 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? Вы сами это сделали?

Ответы на вопрос(2)

Ваш ответ на вопрос