CSV с датами в десятичном формате - PullRequest
0 голосов
/ 30 октября 2018

Мне предоставлен CSV-файл со столбцом даты следующим образом:

1990.12466
1990.20137
1990.2863
1990.36849
1990.45342
1990.53562
1990.62055
1990.70548
1990.78767
1990.8726
1990.95479
1991.03973

Это данные, которые я буду использовать в старших таблицах. Кажется, я не могу найти какую-либо функциональность для передачи этих форматов в ГГГГММДД

Похоже, что эти данные были получены в R с использованием чего-то вроде функции lubridate, но я не могу это подтвердить.

Есть идеи о том, как получить эти данные в ГГГММДД?

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Предполагая, что первые четыре цифры представляют год, а цифры после десятичной запятой представляют процентное отношение к году, вы можете использовать следующую формулу для преобразования этих значений в код даты и времени MS Excel: (с датами, которые должны быть преобразуется в колонке «А»)

=DATE(MID(A1,1,4),1,1)+((A1-MID(A1,1,4))*(IF(OR(MOD(MID(A1,1,4),400)=0,AND(MOD(MID(A1,1,4),4)=0,MOD(MID(A1,1,4),100)<>0)),365, 366)))

Если у вас есть эти коды даты и времени в MS Excel, вы можете отформатировать дату в Excel в любой нужный вам формат (см. Отформатируйте дату так, как вы хотите ).

0 голосов
/ 30 октября 2018

Что бы это ни стоило, вот очень небольшая вариация ответа Майкла Луго , который действительно добивается цели. Функция ISOdate() выводит объект даты и времени. Следующий код использует as.Date(), который выводит только дату. В следующем коде также используется краткий ярлык для подсчета количества дней в календарном году, которое понадобится для интерполяции. Однако этот ярлык требует загрузки библиотеки, чего нет в исходном ответе.

library(lubridate)
decimals <- c(1990.12466,1990.20137,1990.2863,1990.36849,1990.45342,1990.53562,1990.62055,1990.70548,1990.78767,1990.8726,1990.95479,1991.03973)

decimal_to_date2 = function(dt){
  nDays <- yday(paste0(floor(dt),"-12-31"))
  day1 <- as.Date(paste0(floor(dt),"-01-01"))
  interpolated_date <- day1+(dt-floor(dt))*nDays
  return(format(interpolated_date, '%Y%m%d'))
}
decimal_to_date2(decimals)

Результаты первого ответа и моего идентичны.

0 голосов
/ 30 октября 2018

Нечто подобное должно работать. Сначала мы линейно интерполируем между началом года и концом года, а затем форматируем вывод в формате ГГГГММДД в ​​соответствии с запросом:

decimal_to_date = function(dt){
  yr = floor(dt)
  yr_begin = ISOdate(yr, 1, 1, 0, 0, 0)
  yr_end = ISOdate(yr+1, 1, 1, 0, 0, 0)
  interpolated_date = yr_begin + (yr_end - yr_begin) * (dt - yr)
  return(format(interpolated_date, '%Y%m%d'))
}

Тогда, например, decimal_to_date(1990.12466) возвращает 19900215 за 15 февраля 1990 г. Если вы выводите время и даты, время дня всегда очень близко к полудню, что наводит на мысль о процессе, который сгенерировал ваши данные, хотя я не совсем уверен, что.

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