Странное поведение с parse_time()

#r #readr

Вопрос:

Я пытаюсь проанализировать строку, представляющую период, состоящий из минут, секунд и миллисекунд. Мои предпочтительные функции для этого были бы взяты из readr пакета, где секунды и миллисекунды могут рассматриваться совместно как частичные секунды. По-видимому, в этом пакете есть молчаливое предположение, что минуты представлены в виде двух цифр, т. е. дополнены нулями.

 readr::parse_time("1:23.456", format="%M:%OS")  # doesn't work
readr::parse_time("01:23.456", format="%M:%OS") # works
 

ms Функция from lubridate обрабатывает это прямо из коробки:

 lubridate::ms("1:23.456")
 

Есть ли обходной путь для этого, чтобы я мог использовать parse_time и другие функции, readr не прибегая к заполнению нулями самостоятельно?

Ответ №1:

Спецификации формата можно посмотреть здесь: https://stat.ethz.ch/R-manual/R-devel/library/base/html/strptime.html и https://readr.tidyverse.org/reference/parse_datetime.html

Проблема здесь в том, что %M относится к времени, показанному в минутах между "00" и "99" . Обратите внимание, что это точная спецификация, которую вы передали, поэтому она является частью указанного формата, а не предположением о пакете. Насколько мне известно, нет аргумента минут, который принимает различные длины строк, которые могут быть переданы в столбец формат. (Это отличается от аргумента day, который принимает один символ).

Функция ms Lubridate использует другой метод для анализа временных строк. Функция Lubridate гораздо более надежна из-за возможности обрабатывать множество форматов, включая тот, который указан в вопросе, когда формат не задан.