Как остановить неявное преобразование даты при использовании ifelse с данными даты и времени?

У меня есть фрейм данных, который содержит один столбец, который представляет собой серию дат, собранных с помощью формы Google. Дата и время были собраны отдельно. Данные были введены путем выбора дня в календаре, а дата была введена вручную - это должны были быть 24-часовые часы, но поле, похоже, только что проверило, что часы и минуты были в правильном диапазоне.

Я прочитал файл из .csv, Я преобразовал поле символа даты и времени (как прочитано в .csv) к формату даты и времени в новой переменной с помощью as.POSIXct(foo$When, tz="NZ", format="%Y-%m-%d %H:%M"), Даты и время были правильно построены.

За исключением: у меня есть некоторые неправильные записи даты / времени в исходных данных. Все это было установлено на NA в новом поле, как вы ожидаете. Для тех, у кого есть время, я пытался исправить их, сохраняя при этом POSIXct формат.

Я был неудачным.

Вот пример данных, которые у меня есть, и что я пытался сделать:

TestDataForHelp <- data.frame(OldDateTime = 
   c("2013-12-04 21:10", "2013-12-15 09:07", "2014-01-01 06:27",
     "2014-11-02 21:15", "2014-11-07 23:00", "2015-01-04 21:42",
     "201508-11-02 20:15", "201508-11-02 20:15", "2017-11-02"))
TestDataForHelp$ActualDateTime <- 
   as.POSIXct(TestDataForHelp$OldDateTime, tz="NZ", format="%Y-%m-%d %H:%M")

TestDataForHelp$FixedDateTime <- 
  ifelse(TestDataForHelp$OldDateTime=="201508-11-02 20:15", 
         as.POSIXct("2015-11-02 20:15", tz="NZ", format="%Y-%m-%d %H:%M"),
         TestDataForHelp$ActualDateTime)

Новая переменная, FixedDateTime, не имеет POSIXct type, Он был неявно преобразован в numeric тип. Как я могу сохранить POSIXct формат из ActualDateTime а не есть неявное преобразование типов?

Я хотел бы не иметь FixedDateTime но, скорее, положить исправленные данные в ActualDateTime, ifelse() кажется, часть кода, вызывающая сдвиг формата POSIXct в numeric, Если я сделаю:

 TestDataForHelp$CopiedDateTime <- TestDataForHelp$ActualDateTime

Новая переменная, которая является просто копией оригинала, сохраняет POSIXct тип.

Предыдущий вопрос, связанный в комментариях, относится только к значениям даты, а не к значениям даты и времени. Манипулирование данными усложняется при работе со значениями даты и времени, учитывая, что у меня также нет секунд. Другое отличие состоит в том, что исходная переменная содержит сочетание значений даты, даты и времени и неправильных значений даты и времени, тогда как в предыдущем вопросе значения были одинаковыми. Было неясно, было ли причиной проблемы неоднородное содержимое переменной.

Изменить: я исправил проблему, исправив строки, прежде чем я преобразовал их в даты. Это избавило от необходимости пытаться перебрать даты.

1 ответ

Я могу повторить числовой ответ, но не объяснить его. Тем не менее, он рассчитывает результаты правильно для вас. Я не уверен, почему он возвращается в виде числа. Однако преобразование из числа в число достаточно просто, если вы знаете происхождение, которое должно быть 1970-01-01. Поэтому я считаю, что следующее делает свое дело:

(Обратите внимание, первый блок - это то, что у вас уже есть)

TestDataForHelp$FixedDateTime <- ifelse(TestDataForHelp$OldDateTime=="201508-11-02 20:15", 
                                as.POSIXct("2015-11-02 20:15", tz="NZ", format="%Y-%m-%d %H:%M"),
                                TestDataForHelp$ActualDateTime)

TestDataForHelp$FixedDateTime <- as.POSIXct(TestDataForHelp$FixedDateTime, 
                                            origin = as.POSIXct("1970-01-01", tz="NZ"))
Другие вопросы по тегам