Дата конвертации в For Loop в R - источник должен быть указан

У меня есть последовательность дат в R, и для каждой даты мне нужно получить год, месяц и день. Я пытался использовать функцию strftime, чтобы распечатать год, но R ведет себя очень странно. Этот код не работает:

# sequence of dates
dates <- seq(as.Date("1987-03-29"), as.Date("1991-12-31"), by=1)

# this fails with "'origin' must be supplied" error:
for (d in dates) {
  year <- strftime(d, "%Y")
  print(year)
}

Точное сообщение об ошибке: Error in as.POSIXlt.numeric(x, tz = tz) : 'origin' must be supplied

С другой стороны, этот код работает без ошибок:

# sequence of dates
dates <- seq(as.Date("1987-03-29"), as.Date("1991-12-31"), by=1)

# this works
for (i in 1: length(dates)) {
  year <- strftime(dates[i], "%Y")
  print(year)
}

Почему первый пример терпит неудачу, а второй пример работает? Я подозреваю, что в первом примере R пытается преобразовать мою дату в какой-то объект POSIXct, а во втором - нет? Я смущен, почему есть какая-то разница, и я был бы признателен за объяснение того, что происходит. Я использую R версии 3.2.2.

1 ответ

Решение

for создает d как числовой Вот два подхода.

Ниже были удалены комментарии и отмечены только строки кода ## были изменены.

1) список Используйте список вроде этого:

dates <- seq(as.Date("1987-03-29"), as.Date("1991-12-31"), by=1)

for (d in as.list(dates)) {  ##
  year <- strftime(d, "%Y")
  print(year)
}

2) as.ate или конвертировать d вернуться к "Date" учебный класс.

dates <- seq(as.Date("1987-03-29"), as.Date("1991-12-31"), by=1)

for (d in dates) {
  year <- strftime(as.Date(d, origin = "1970-01-01"), "%Y") ##
  print(year)
}
Другие вопросы по тегам