Невозможно отформатировать месяцы с as.Date - PullRequest
6 голосов
/ 20 сентября 2011

Я упускаю что-то очевидное в разделе "формат" as.Date.Рассмотрим этот пример

d1 <- data.frame(d = c("1/Jan/1947", "1/Feb/1947", "1/Mar/1947"), d2 = c("Jan/1947", "Feb/1947", "Mar/1947"))

d1$date1 <- as.Date(x=d1$d, format="%d/%b/%Y")
d1$date2 <- as.Date(x=d1$d2, format="%b/%Y")

           d       d2      date1 date2
1 1/Jan/1947 Jan/1947 1947-01-01  <NA>
2 1/Feb/1947 Feb/1947 1947-02-01  <NA>
3 1/Mar/1947 Mar/1947 1947-03-01  <NA>

, поэтому мой вопрос очень прост - я не понимаю, почему date1 работает, а date2 нет.

Ответы [ 4 ]

16 голосов
/ 20 сентября 2011

Самый простой ответ заключается в том, что дата - это нечто, включающее день, и если оно не указано, as.Date () запутывается. Из документации? As. Дата:

Если в строке даты не указана дата полностью, возвращаемый ответ может зависеть от системы. Самое распространенное поведение Предполагается, что текущим является отсутствующий год, месяц или день. Если в нем указана неправильная дата, надежные реализации выдает ошибку, и дата указывается как «NA». к несчастью некоторые распространенные реализации (такие как «glibc») ненадежны и угадайте в намеченном значении.

Когда вы думаете об этом, такой термин, как "март 1947 года", строго говоря, не является датой - это просто сочетание месяца и года. Дата - это определенный день марта 1947 года (или любого другого месяца + года) - поскольку вы не указываете дату, у вас нет даты.

9 голосов
/ 20 сентября 2011

Это потому, что d2 в вашем data.frame является неправильной датой.Это не содержит день.Чтобы обойти это, рассмотрите использование следующего:

d1$date2 <- as.Date(x=paste("1/",d1$d2, sep=""), format="%d/%b/%Y")
> d1
           d       d2      date1      date2
1 1/Jan/1947 Jan/1947 1947-01-01 1947-01-01
2 1/Feb/1947 Feb/1947 1947-02-01 1947-02-01
3 1/Mar/1947 Mar/1947 1947-03-01 1947-03-01
0 голосов
/ 05 июня 2019

Согласно документу Коул Бека «Обработка даты и времени в R», внутренне дата сохраняется как одно числовое значение, которое подсчитывает количество дней, прошедших с контрольной даты, 1970-01-01.Пример: 1970-01-31 будет внутренне сохранен как 30.

Итак, возвращаясь к проблеме, когда день (% d) не указан в данной входной дате (то есть, неполной дате), она не может хранить дату внутри, что приводит к «Предупреждающему сообщению: NA введены по принуждению»

Источник: http://biostat.mc.vanderbilt.edu/wiki/pub/Main/ColeBeck/datestimes.pdf

0 голосов
/ 20 сентября 2011

Я не знаю, но% b, похоже, не работает, когда это ведущее поле.

Следующие все не срабатывают (дают NA):

> as.Date("Jan/1947", format="%b/%Y")
> as.Date("Jan 1947", format="%b %Y")
> as.Date("jan1947", format="%b%Y")
> as.Date("Jan1947", format="%b%Y")

, тогда как когдавы предшествуете% b с% d, это работает:

> as.Date("1Jan1947", format="%d%b%Y")
> as.Date("29-Jan-1947", format="%d-%b-%Y")
> as.Date("08/Aug/1947", format="%d/%b/%Y")
> as.Date("22 Dec 1947", format="%d %b %Y")

Похоже, neilfws имеет ответ о неполноте.Это также объясняет, почему только год дает:

> as.Date("1947", format="%Y")
[1] "1947-09-19"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...