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

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

Вот пример:

 > 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 с дробной частью 0,3 секунды. Когда оно печатается с одной десятичной цифрой, отображается значение 0,2. Я много работаю с метками времени с точностью до миллисекунды, и это вызывает у меня много головной боли из-за того, что время часто печатается на одну ступень ниже, чем фактическое значение.

Вот что происходит: POSIXct - это число с плавающей запятой в секундах с начала эпохи. Все целочисленные значения обрабатываются точно, но с основанием 2 с плавающей запятой, ближайшее значение к .3 немного меньше, чем .3. Заявленное поведение strftime () для формата % OSn заключается в округлении в меньшую сторону до запрошенного числа десятичных цифр, поэтому отображается результат .2. Для других дробных частей значение с плавающей запятой немного выше e введенное значение и отображение дает ожидаемый результат:

 > 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? Вы бы сами это спроектировали?

56
задан Henrik 16 November 2016 в 18:11
поделиться