Создать единую дату в разных форматах - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть набор данных с приблизительно 53 000 строк, и один из столбцов измеряет дату и время, когда было выполнено наблюдение.Во время сбора данных каким-то образом формат даты переключался с мм / дд / год на дд / мм / год, и это происходило несколько раз.Тем не менее, я знаю точную строку, где произошла каждая из этих ошибок, поэтому мне было интересно, есть ли эффективный способ изменить их все на один формат (я хочу, чтобы они были в мм / дд / год, так как именно это большинство наблюденийнаходятся в).

Вот пример проблемы, о которой я говорю, переходя от дд / мм / год к мм / дд / год:

data.test = data.frame(Date = c("16/11/2017 8:45 AM", "16/11/2017 9:00 AM", 
"11/16/2017 9:15 AM", "11/16/2017 9:30 AM"), Observed = c(100, 23, 291, 30))
data.test

Date                Observed
16/11/2017 8:45 AM  100         
16/11/2017 9:00 AM  23          
11/16/2017 9:15 AM  291         
11/16/2017 9:30 AM  30  

В моем наборе данных,даты - это символы, а остальные строки - числа.

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019

Вы говорите, что знаете местоположение (предположительно диапазон номеров строк), где должны произойти изменения, но вы не дали их в своем примере, возможно, потому что это было очевидно.Но это не было бы очевидно в случаях, когда и мм, и дд были меньше 13.

data.test$Date <- as.character(data.test$Date) # prevent factor issues
dd_mm <- 1:2 # the rows to be changed
repl <-format( as.POSIXct( data.test$Date[dd_mm], format="%d/%m/%Y %H:%M %p"), format="%m/%d/%Y %H:%M %p" )
data.test$Date[dd_mm] <- repl
data.test
#-------------------------------------------
                 Date Observed
1 11/16/2017 08:45 AM      100
2 11/16/2017 09:00 AM       23
3  11/16/2017 9:15 AM      291
4  11/16/2017 9:30 AM       30
0 голосов
/ 23 февраля 2019

Я предпочитаю использовать функцию lubridate::parse_date_time в таком случае для обработки разнородного формата даты / времени в том же столбце

# Sample data.frame
# I have modified one date from sample used by OP to include both AM and PM 
data.test = data.frame(Date = c("16/11/2017 8:45 AM", "16/11/2017 9:00 PM", 
               "11/16/2017 9:15 AM", "11/16/2017 9:30 AM"), Observed = c(100, 23, 291, 30))

#modified column added in consistent format. 
library(lubridate)
data.test$modifeddatetime <- parse_date_time(data.test$Date, c("dmY HM p", "mdY HM p"))

#Change the modfieddatetime column back in character in desired format
data.test$modifeddatetime <- format(data.test$modifeddatetime, format="%m/%d/%Y %H-%M")


data.test
#                 Date Observed  modifeddatetime
# 1 16/11/2017 8:45 AM      100 11/16/2017 08-45
# 2 16/11/2017 9:00 PM       23 11/16/2017 21-00
# 3 11/16/2017 9:15 AM      291 11/16/2017 09-15
# 4 11/16/2017 9:30 AM       30 11/16/2017 09-30
0 голосов
/ 23 февраля 2019

Вот интересная попытка сделать это.Предполагая, что ваше первое наблюдение составлено в правильном формате, немного кода проработано для проверки наиболее правдоподобного формата даты, основанного на том, в каком месяце должна быть дата. Как она справляется с изменением месяцев. Я еще не совсем уверен,

Мысль о том, что до тех пор, пока первое наблюдение верно, она будет переноситься в правильном формате, пока не будет достигнута неоднозначная дата.В этот момент он сверяется с предыдущим месяцем наблюдения, который должен быть правильным.Если они совпадают, то текущее неоднозначное наблюдение было предсказано правильно, в противном случае он выбирает другой формат на месте.Опять же, когда месяцы сменяются, и неоднозначные хиты требуют некоторой работы, но я слишком ленив (это пятница)

data.test = data.frame(Date = c("9/8/2017 8:30 AM","8/9/2017 8:45 AM", "16/11/2017 9:00 AM", "11/16/2017 9:15 AM", "11/16/2017 9:30 AM"), Observed = c(100, 23, 291, 30, 45))

Date1<-
as.POSIXct(data.test$Date, format="%m/%d/%Y %H:%M %p") # search for format1
Date2<-
as.POSIXct(data.test$Date, format="%d/%m/%Y %H:%M %p") # search for format2

# Replace data.test Date Column with Date1, leaving NAs
data.test$Date<-Date1


#Check most plausible date format.
for(i in 1:length(Date1)){
  if(is.na(Date1[i])==F  && is.na(Date2[i])==F && i!= 1){
    print(paste("row",i , "ambigious format"))
      if(month(Date1[i-1])==month(Date1[i])){
         print("Date Estimated from mm/dd/YYYY format based on previous")
      }else{
         Date1[i]<-Date2[i]
         print("Date Estimated from dd/mm/YYYY format based on previous")
}
}else{}
}



# Replace NAs in data.test with index from Date2, line up
data.test$Date[is.na(data.test$Date)] <- Date2[is.na(data.test$Date)]

> data.test
                 Date Observed
1 2017-09-08 08:30:00      100
2 2017-09-08 08:45:00       23
3 2017-11-16 09:00:00      291
4 2017-11-16 09:15:00       30
5 2017-11-16 09:30:00       45
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...