2012-09-04 5 views
5

Tengo varios archivos CSV con el formato:El uso de pandas pitón para analizar CSV con la fecha en el formato año, día, hora, minuto, segundo

Year,Day,Hour,Min,Sec.,P1'S1 
2003, 1, 0, 0,12.22, 0.541 
2003, 1, 1, 0,20.69, 0.708 
2003, 1, 2, 0, 4.95, 0.520 
2003, 1, 3, 0,13.42, 0.539 
... 

(donde día, es el día de la año) y estoy tratando de leerlos usando la biblioteca pandas (parece una lib fantástica hasta el momento).

Hay una función incorporada para leer CSV en pandas, y aún mejor, esa función supuestamente verifica las columnas para un tipo de fecha. y automáticamente lo usa como un índice (que sería exactamente perfecto para lo que estoy haciendo).

La cuestión es que no puedo hacer que funcione con datos de fecha en este formato.

me trataron:

data = pd.read_csv("csvFile.csv", index_col=[0, 1], , index_col=[0, 1, 2, 3, 4] parse_dates=True) 

pero sólo se pone el año correctamente:

In [36]: data.index 
Out[36]: 
MultiIndex 
[(<Timestamp: 2003-09-04 00:00:00>, 1, 0, 0, 12.22) 
(<Timestamp: 2003-09-04 00:00:00>, 1, 1, 0, 20.69) 
(<Timestamp: 2003-09-04 00:00:00>, 1, 2, 0, 4.95) ..., 
(<Timestamp: 2003-09-04 00:00:00>, 365, 21, 0, 3.77) 
(<Timestamp: 2003-09-04 00:00:00>, 365, 22, 0, 14.6) 
(<Timestamp: 2003-09-04 00:00:00>, 365, 23, 0, 13.36)] 

De la documentación, veo que se puede especificar el "date_parser" atributo en el read_csv función de pandas. Pero la documentación no muestra cómo y no puedo resolverlo. Cualquier persona con experiencia en el tema que pueda ayudar.

Saludos, Bruno

Respuesta

11

Con el fin de analizar una fecha de varias columnas, tiene que decirle a los pandas las columnas que se deben combinar en una sola fecha, por lo que necesita decir parse_dates=['Year','Day','Hour','Min','Sec']

También es necesario para definir su propio programa de análisis que toma un elemento de cada columna especificado en parse_dates:

In [1]: import pandas as pd 

In [2]: from datetime import datetime, timedelta 

In [3]: from cStringIO import StringIO 

In [4]: data = """\ 
Year,Day,Hour,Min,Sec.,P1'S1 
2003, 1, 0, 0,12.22, 0.541 
2003, 1, 1, 0,20.69, 0.708 
2003, 1, 2, 0, 4.95, 0.520 
2003, 1, 3, 0,13.42, 0.539 
""" 

In [5]: def parse(yr, doy, hr, min, sec): 
    yr, doy, hr, min = [int(x) for x in [yr, doy, hr, min]] 
    sec = float(sec) 
    mu_sec = int((sec - int(sec)) * 1e6) 
    sec = int(sec) 
    dt = datetime(yr - 1, 12, 31) 
    delta = timedelta(days=doy, hours=hr, minutes=min, seconds=sec, 
         microseconds=mu_sec) 
    return dt + delta 
    ...: 

In [6]: pd.read_csv(StringIO(data), parse_dates={'datetime':  
      ['Year','Day','Hour','Min','Sec.']}, 
      date_parser=parse, index_col='datetime') 
Out[6]: 
          P1'S1 
datetime       
2003-01-01 00:00:12.220000 0.541 
2003-01-01 01:00:20.690000 0.708 
2003-01-01 02:00:04.950000 0.520 
2003-01-01 03:00:13.419999 0.539 
+0

he comprobado, y el problema es que el archivo tiene un espacio antes del "Año" de cabecera (al igual que los valores de año Por debajo de eso). Funciona perfectamente si coloco un espacio en read_csv antes del 'Año' para convertirme en 'Año'. Muy exigente, pero funciona. ¡Gracias! – jbssm

Cuestiones relacionadas