Неправильная разница в датах в разных форматах - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть даты, которые выглядят так:

[474] "26-08-18" "1-09-18" "1-09-18"  "1-09-18"  "1-09-18"  "2-09-18" 

, и я хотел бы вычесть другую дату, но я нахожу следующую проблему:

> (fdate <- as.Date(Sys.Date(), format="%Y-%m-%d"))
[1] "2018-09-12"
> as.Date("30-09-18", format="%d-%m-%Y") - fdate
Time difference of -730467 days

Я решил проблему с помощью пакета lubridate следующим образом:

> lubridate::dmy("30-09-18") - as.Date(Sys.Date())
Time difference of 18 days

Однако я был удивлен, что использование as.Date (и указание format) не работает.Это почему ?[Или, скорее, что я делаю не так в базе R?]

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

На наш взгляд, мы сразу видим (учитывая, что мы пишем это в 2018 году), что 30-09-18 означает 30 сентября 2018 года нашей эры;компьютер (то есть R), однако, нуждается в некоторой помощи (как заключено в строку format).

Вы сказали, что последняя часть вашего ввода %Y -форматирована;поэтому он интерпретируется согласно инструкциям в ?strptime:

Год с веком .[...]

Итак, R видит 30-09-18 и думает «30 сентября 18 г. н.э.».Конечно, это было давным-давно:

as.Date("30-09-18", format="%d-%m-%Y") - as.Date('2018-09-12')
# Time difference of -730467 days

Это должно быть около 2000 лет назад, верно?

730467/365.25 # rudimentary accounting for leap years/centuries
# [1] 1999.91

Чтобы исправить проблему, удобная Ctrl F на ?strptime для year может помочь определить правильный вариант, %y:

Год без века (00–99).На входе значения 00 до 68 начинаются с префикса 20 и 69 до 99 с 19 - это поведение, указанное в стандартах POSIX 2004 и 2008 годов, но они также говорят:ожидается, что в будущей версии столетие по умолчанию, выведенное из двухзначного года, изменится ».

А затем ожидаемый результат:

as.Date("30-09-18", format="%d-%m-%y") - as.Date('2018-09-12')
# Time difference of 18 days

Урок, всегда двойной/ Тройная проверка руководства ?strptime при обнаружении неожиданного поведения ... Говоря по опыту!

0 голосов
/ 12 сентября 2018

Практически просто формализуя вышеприведенные комментарии:

Проблема:

  1. as. Дата преобразования

as.Date("30-09-18", format="%d-%m-%Y")

Выходы: [1] "0018-09-30"

Указывая «% Y», он ожидает ввода «гггг», поэтому в вашем случае предполагается, что 0018

as.Date("30-09-18", format="%d-%m-%y")

Выходы : [1] "2018-09-30"

Следовательно

as.Date("30-09-18", format="%d-%m-%y") - Sys.Date()

Выходы: Time difference of 18 days

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