Il problema con la parte %p
è locale. Vedi questo issue.
L'incapacità di analizzare ha a che fare con il modo in cui l'indovino lubridato funziona.
Ci sono due modi per la lubrificazione dei formati, flessibile ed esatto. Con il flex matching tutti gli elementi numerici possono avere una lunghezza flessibile (ad esempio, sia 4
che 04
per giorno lavoreranno), ma poi, ci devono essere separatori non numerici tra gli elementi. Per il matcher esatto non sono necessari separatori non numerici, ma gli elementi devono avere il numero esatto di cifre (come 04
).
Sfortunatamente non è possibile combinare entrambi i matcher in un'unica espressione. Sarebbe estremamente difficile risolvere questo problema e preservare l'attuale flessibilità del parser lubridato.
Nel tuo esempio
> parse_date_time('4/18/1950 0130', 'mdY HM')
[1] NA
Warning message:
All formats failed to parse. No formats found.
si desidera eseguire corrispondenza flex da parte della data 4/18/1950
e la corrispondenza esatta su part-time 0130
.
Si prega di notare che se il vostro data-ora è completamente flex
, o completamente formato exact
l'analisi funzionerà come previsto:
> parse_date_time('04/18/1950 0130', 'mdY HM')
[1] "1950-04-18 01:30:00 UTC"
> parse_date_time('4/18/1950 1:30', 'mdY HM')
[1] "1950-04-18 01:30:00 UTC"
I lubridate 1.4.1
"fissa" questo con l'aggiunta di un nuovo argomento di parse_date_time
, exact=FALSE
. Se impostato su TRUE
, l'argomento orders
viene interpretato come contenente i formati esatti strptime
e non viene eseguita alcuna ipotesi o addestramento. In questo modo è possibile aggiungere tutti i formati esatti che si desidera e si otterrà anche in velocità perché non viene eseguita alcuna ipotesi.
> parse_date_time(c('12/17/1996 04:00:00','4/18/1950 0130'),
+ c('%m/%d/%Y %I:%M:%S','%m/%d/%Y %H%M'),
+ exact = T)
[1] "1996-12-17 04:00:00 UTC" "1950-04-18 01:30:00 UTC"
relazione a ciò, v'è stato un esplicito requested chiedere una tale opzione.
Sono in grado di replicare l'errore. 'parse_date_time (x = mydates, orders = c ('m/d/YI: M: S p', 'm/g/Y HM'), locale =" eng ")' indica il valore corretto per il primo ma non la seconda data/ora. 'parse_date_time (mydates1, ordini = c ('% m /% d /% Y% H% M'))' non funziona ma .... 'strptime (mydates1, format ="% m /% d /% Y% H% M ")' funziona comunque ... quando 'mydates1' è solo la seconda data' 4/18/1950 0130' – jalapic
Credo che il problema sia con il '0130' del secondo stringa. Se lo cambi in '4/18/1950 01: 30', credo che le cose funzioneranno come previsto. – JasonAizkalns
@JasonAizkalns '0130' può essere analizzato da solo: 'parse_date_time ('0130', '% H% M')' dà '" 0-01-01 01:30:00 UTC "'. –