Как использовать fast_strtime() в data.table?

#r #data.table #lubridate

#r #data.table #lubridate

Вопрос:

Мне нужна помощь, чтобы использовать fast_strptime в data.table для преобразования строки в формат даты, я попробовал следующие решения:

 dt<-data.table(Month_Year=c("JAN 2020","FEB 2020", "MAR 2020"), val=c(1:3))
dt[,Date:=as.POSIXct(fast_strptime(Month_Year,format= "%^b %Y"))]
dt$Date<-fast_strptime(dt$Month_Year, format="%b %Y")
  

Ни один из них не работает, я ценю любую помощь!
Заранее спасибо!

Комментарии:

1. Из какого это пакета? 'fast_strptime' is not an exported object from 'namespace:data.table'

2. Может быть, это из lubridate? Похоже, это не векторизованная функция…

3. исправьте, это функция пакета lubridate

Ответ №1:

Это работает нормально

 dt[,Date:=as.POSIXct(lubridate::fast_strptime(Month_Year, "%b %Y"))]
  

Проблема в том, что fast_strptime() создается объект POSIXlt, а не объект POSIXct. POSIXlt — это в основном список целых чисел, поэтому data.table путается, тогда как POSIXct — это одно числовое значение.

Я бы, наверное, использовал parse_date_time , хотя

 dt[,Date:=lubridate::parse_date_time(Month_Year, "my")]
  

Комментарии:

1. не могли бы вы объяснить, что там произошло? почему as.POSIXct экономит день и преобразует вектор из 9 элементов (выводимый из lubridate::fast_strptime(Month_Year, «%b %Y»)) в вектор из 3 элементов?

2. Я получил следующее предупреждение: Invalid .internal.selfref обнаружен и исправлен путем создания (неглубокой) копии data.table, чтобы := мог добавить этот новый столбец по ссылке. Ранее эта data.table была скопирована R (или была создана вручную с помощью structure() или аналогичной). Избегайте имен <- и attr<- которые в R в настоящее время (и странно) могут копировать всю data.table . Вместо этого используйте синтаксис set*, чтобы избежать копирования: ?set, ?setnames и ?setattr . Если это сообщение не помогло, пожалуйста, сообщите о своем варианте использования в службу отслеживания проблем data.table, чтобы можно было устранить основную причину или улучшить это сообщение.

3. Что означает это предупреждение?

4. @Irina это как-то связано с многократной перезаписью столбцов разными типами. Если вы начнете сначала и просто создадите dt таблицу, а затем запустите строку в моем ответе, она должна исчезнуть.

Ответ №2:

Ну, я нашел обходной путь, не с помощью функции fast_strptime(), но на данный момент он соответствует моим ожиданиям:

 dt[,Date:=as.Date(paste("01",Month_Year, sep=" "),format = "%d %b %Y")] 
  

Я надеюсь, что это поможет другим, кто сталкивается с той же проблемой.

Но я все еще заинтересован в том, как использовать fast_striptime в сочетании с data.table. 🙂