Извлекать элементы даты из POSIXlt и помещать во фрейм данных в R

#r

#r

Вопрос:

Мой второй вопрос за день и моя последняя попытка использовать R для очистки этих данных. Вот sitrep:

У меня есть фрейм данных, в котором есть столбец, который является типом даты POSIXlt. Я хочу извлечь день, месяц и год из этого столбца и создать 3 новых столбца, называемых (умно) день, месяц и год.

Фрейм данных выглядит следующим образом:

 order_id      dd_mmm_yy
   1          2005-07-28
   2          2007-03-04
  

Я хочу закончить этим:

 order_id      dd_mmm_yy    day   month   year
   1          2005-07-28    28     7     2005
   2          2007-03-04    4      3     2007
  

Я создал функцию для извлечения дня, месяца и года и возврата их в виде списка (или фрейма данных, я пробовал оба варианта).

 extractdate = function (date) {
        day = format(date, format="%d")
        month = format(date, format="%m")
        year = format(date, format="%Y")

       list(day=day, month=month, year=year)
 }
  

Вот что я попробовал, основываясь на более ранней проблеме и вопросе:

 cbind(orders, t(sapply(orders$dd_mmm_yy, extractdate)))
  

что дает мне это:

 Error in data.frame(..., check.names = FALSE) : 
arguments imply differing number of rows: 5, 9
  

Значение t (sapply… само по себе дает мне это по какой-то сумасшедшей причине:

       day         month       year       
sec   Character,5 Character,5 Character,5
min   Character,5 Character,5 Character,5
hour  Character,5 Character,5 Character,5
mday  Character,5 Character,5 Character,5
mon   Character,5 Character,5 Character,5
year  Character,5 Character,5 Character,5
wday  Character,5 Character,5 Character,5
yday  Character,5 Character,5 Character,5
isdst Character,5 Character,5 Character,5
  

Что, черт возьми, происходит? Может быть, мне лучше использовать что-то вроде Python или Java для выполнения всех необходимых манипуляций с данными, прежде чем переносить их в R для анализа?

Ответ №1:

POSIXlt объекты представляют собой список из 9 компонентов (смотрите раздел Details в ?POSIXlt для получения дополнительной информации). Поскольку dd_mmm_yy столбец является POSIXlt , вам не нужна функция для извлечения компонентов. Вы можете просто извлечь компоненты по их именам:

 orders$day <- orders$dd_mmm_yy$mday        # day of month
orders$month <- orders$dd_mmm_yy$mon 1     # month of year (zero-indexed)
orders$year <- orders$dd_mmm_yy$year 1900  # years since 1900
orders
#   order_id  dd_mmm_yy day month year
# 1        1 2005-07-28  28     7 2005
# 2        2 2007-03-04   4     3 2007
  

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

1. Спасибо! Это сработало отлично. Я знал, что должно быть простое решение.

2. Существует проблема с этим решением, проверьте ниже.

3. @user1034797: с этим решением проблем нет. Вы предполагаете, что я изменяю элементы объекта POSIXlt, чего я не делаю.

Ответ №2:

Одна строка с использованием lubridate

 require(plyr); require(lubridate)
mutate(mydf, date = ymd(dd_mmm_yy), day = day(date), 
  month = month(date), year = year(date))

  order_id  dd_mmm_yy       date day month year
1        1 2005-07-28 2005-07-28  28     7 2005
2        2 2007-03-04 2007-03-04   4     3 2007
  

Ответ №3:

Попробуйте это (DF в качестве вашего data.frame):

 extractdate <- function(date) {
    day <- format(date, format="%d")
    month <- format(date, format="%m")
    year <- format(date, format="%Y")

    cbind(day, month, year)
}

cbind(DF, extractdate(DF$dd_mmm_yy))
  

Ответ №4:

Если вы используете data.table пакет, в нем уже есть функции для извлечения компонентов времени данных из POSIXct.

 second(x)
minute(x)
hour(x)
yday(x)
wday(x)
mday(x)
week(x)
isoweek(x)
month(x)
quarter(x)
year(x)
  

Использование простое (например, dt[, day := day(dd_mmm_yy)] ). Вы можете посмотреть полную документацию здесь.