2015-07-27 9 views
5

miei dati reali assomigliain `as.POSIXct` con Excel

8/8/2013 15:10 
7/26/2013 10:30 
7/11/2013 14:20 
3/28/2013 16:15 
3/18/2013 15:50 

Quando ho letto da file excel, R recita,

41494.63 
41481.44 
41466.60 
41361.68 
41351.66 

così ho usato, e ho as.POSIXct(as.numeric(x[1:5])*86400, origin="1899-12-30",tz="GMT") got,

2013-08-08 15:07:12 GMT 
2013-07-26 10:33:36 GMT 
2013-07-11 14:24:00 GMT 
2013-03-28 16:19:12 GMT 
2013-03-18 15:50:24 GMT 

Perché c'è una differenza nel tempo? Come superarlo?

+0

Non sei sicuro di quello che sta succedendo con la risposta qui, ma forse provare questo 'as.POSIXct (x * 60 * 60 * 24, tz = "GMT", origine = "1900-01-01")' se questo è il tuo x: 'x <- c (41494.63, 41481.44, 41466.60, 41361.68, 41351.66)' –

+1

@DavidArenburg Ma i minuti non sono corretti. –

+0

@David Se cambio la data, cambierà anche la data del mio risultato. Ma le date dei risultati sono corrette nel caso precedente. Il mio problema è solo con i minuti. – Kavipriya

risposta

5

Il problema è che o R di Excel sta arrotondando il numero a due decimali. Quando si converte ad esempio la cella con 8/8/2013 15:10 in formato testo (in Excel su Mac OSX), si ottiene il numero 41494.63194.

Quando si utilizza:

as.POSIXct(41494.63194*86400, origin="1899-12-30",tz="GMT") 

vi darà:

[1] "2013-08-08 15:09:59 GMT" 

Questo è di 1 secondo dal dalla data originale (che è anche un'indicazione che 41494.63194 viene arrotondato a cinque decimali) .

Probabilmente la soluzione migliore da fare è esportare il file Excel a una o un file di .txt separato da tabulazioni .csv e quindi leggere in R. Questo dà me almeno le date corrette:

> df 
      datum 
1 8/8/2013 15:10 
2 7/26/2013 10:30 
3 7/11/2013 14:20 
4 3/28/2013 16:15 
5 3/18/2013 15:50 
+1

'41494.63194' con le ultime 4 ricorrenti dà esattamente il momento giusto. L'arrotondamento è decisamente colpevole qui. – thelatemail

3

Dato

x <- c("8/8/2013 15:10","7/26/2013 10:30","7/11/2013 14:20","3/28/2013 16:15","3/18/2013 15:50") 

(che viene letto come un vettore di carattere),

provare

x <- as.POSIXct(x, format = "%m/%d/%Y %H:%M", tz = "GMT") 

legge correttamente come un vettore POSIXct per me.

+3

Dato che OP ha specificato l'argomento' tz' penso che sia meglio non dimenticarlo perché in Italia dove viviamo 'x' avrà' CEST' come fuso orario. – SabDeM

+0

Nel mio caso, x <-c (41494.63, 41481.44, 41466.60, 41361.68, 41351.66) non come hai fatto tu. quando letto da Excel, l'ora viene letta come questi valori. – Kavipriya

+0

@kavi - dovresti specificare che stai usando Excel nella tua domanda - questo fa la differenza dato che Excel è pazzo nell'affrontare le date. – thelatemail

2

Forse è una questione di come R legge i dati. Solo un esempio qui con lubridate sembra funzionare bene.

x <- "8/8/2013 15:10" 
library(lubridate) 
dmy_hm(x, tz = "GMT") 
[1] "2013-08-08 15:10:00 GMT" 
+0

Questo non risponde alla domanda né immagino. –

+0

@DavidArenburg Penso che tu abbia ragione, ma l'ultima domanda del PO era "come superarlo?" poi ho fornito un modo per superare il problema usando 'lubridate'. Un approccio pragmatico che non spiega perché il problema si verifica ma consente al PO di sconfiggerlo. Sono sicuro che un utente R di potenza risolverà questo e guadagnerà un sacco di voti. – SabDeM

+0

Ma l'input OPs è un numero come '41494.63', non' "8/8/2013 15:10" ' –

1

Questo è come funziona qui su un sistema Windows. Ecco come appare un file Excel 2010 di origine:

date    num   secs  constant Rtime 
(mm/dd/yyyy)  (in Excel) (num*86400) (Windows) (secs-constant) 
08/08/2013 15:10 41494.63 3585136200 2209161600 1375974600 
07/26/2013 10:30 41481.44 3583996200 2209161600 1374834600 
11/07/2013 14:20 41585.60 3592995600 2209161600 1383834000 
03/28/2013 16:15 41361.68 3573648900 2209161600 1364487300 
03/18/2013 15:50 41351.66 3572783400 2209161600 1363621800 

Rtime <- c(1375974600,1374834600,1383834000,1364487300,1363621800) 
as.POSIXct(Rtime,origin="1970-01-01",tz="GMT") 
#[1] "2013-08-08 15:10:00 GMT" "2013-07-26 10:30:00 GMT" 
#[3] "2013-11-07 14:20:00 GMT" "2013-03-28 16:15:00 GMT" 
#[5] "2013-03-18 15:50:00 GMT" 

Perché questa costante? In primo luogo, perché Excel e Office sono generalmente un problema quando si gestiscono le date. Scherzi a parte, guarda qui: Why is 1899-12-30 the zero date in Access/SQL Server instead of 12/31?

2209161600 è la differenza in secondi tra il POSIXct inizio del 1970-01-01 e 1899-12-30, che è il punto 0 in Excel su Windows.

dput(as.POSIXct(2209161600,origin="1899-12-30",tz="GMT")) 
#structure(0, tzone = "GMT", class = c("POSIXct", "POSIXt"))