Как остановить неявное преобразование даты при использовании 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"))