2015-10-11 4 views
5

У меня есть файл csv с одним столбцом временных меток "2000-01-01 12: 00: 00.123456". Каков рекомендуемый способ справиться с этим в таблице данных? Мне нужно, чтобы иметь дело с группировкой, согласованием/прокаткой присоединиться колонком Идата из другой таблицы, временные ряды черчения и т.д.R таблица данных рекомендуемый способ иметь дело с датой времени

IDateTime("2000-01-01 12:00:00.123456") 

Error in if (any(neg)) res[neg] = paste("-", res[neg], sep = "") : 
missing value where TRUE/FALSE needed 

Я вижу этот ответ возможного duplicate вопроса, в котором Мэтью предложил вручную литье даты в целые числа. Но это уже 3 года, и мне интересно, существует ли теперь лучший способ?

+2

Вам необходимо передать ему объект 'POSIXct', попробуйте' IDateTime (as.POSIXct ("2000-01-01 12: 00: 00.123456")) '. Вам может потребоваться указать часовой пояс через аргумент 'tz' для особых случаев. –

+0

Спасибо. Не могли бы вы включить это в ответ, чтобы я мог принять его? – jf328

ответ

7

IDateTime требует, чтобы объект класса POSIXct работал нормально (похоже, он правильно работает с преобразованием factor, не уверен, почему). Я согласен, что это не очень хорошо документировано и, возможно, стоит открыть FR/PR по GH в отношении документации - есть открытая очередь относительно IDateTimevignette. И уже есть FR, что позволяет работать с классом character.

IDateTime(as.POSIXct("2000-01-01 12:00:00.123456")) 
#   idate itime 
# 1: 2000-01-01 12:00:00 
## IDateTime(factor("2000-01-01 12:00:00.123456")) ## will also work 

Обратите внимание на параметр tz в as.POSIXct, если вы хотите, чтобы избежать неожиданного поведения


Несмотря на это, похоже, ошибка на самом деле вызвана методом печати на ITime который вызывает format.ITime см here и here например, если вы запустите res <- IDateTime("2015-09-29 08:22:00"), это будет не, выведите ошибку, хотя res будет NA из-за неправильного преобразования (я считаю) в here (формат только "%H:%M:%OS"). Мне кажется, что это ошибка, и я до сих пор не знаю, почему класс factor работает правильно, когда нет factor в methods(as.ITime). Возможно, из-за его внутреннего режима хранения integer, который вызывает другой связанный метод.

2

В зависимости от точности, необходимой для ваших временных полей, вам может потребоваться использовать POSIXct вместо IDateTime.
Формат временной метки, сохраненный в исходном файле, может быть воспроизведен в R на format(Sys.time(), "%Y-%m-%d %H:%M:%OS6").
При использовании IDateTime вы потеряете субсекунды, вы можете сыграть с ITime и посмотреть, соответствует ли она вашим потребностям.
Если вы будете придерживаться POSIXct, тогда вы должны знать о функции ?setNumericRounding, которая может быть иногда важной, поскольку она влияет на упорядочивание и соединение на базовом числовом типе данных POSIXct.