Tengo una lista de cadenas en python como esta

['AM_B0_D0.0_2016-04-01T010000.flac.h5',
 'AM_B0_D3.7_2016-04-13T215000.flac.h5',
 'AM_B0_D10.3_2017-03-17T110000.flac.h5',
 'AM_B0_D0.7_2016-10-21T104000.flac.h5',
 'AM_B0_D4.4_2016-08-05T151000.flac.h5',
 'AM_B0_D0.0_2016-04-01T010000.flac.h5',
 'AM_B0_D3.7_2016-04-13T215000.flac.h5',
 'AM_B0_D10.3_2017-03-17T110000.flac.h5',
 'AM_B0_D0.7_2016-10-21T104000.flac.h5',
 'AM_B0_D4.4_2016-08-05T151000.flac.h5']

Quiero analizar solo la fecha y la hora (por ejemplo, 2016-08-05 15:10:00) de estas cadenas.

Hasta ahora utilicé un bucle for como el que se muestra a continuación, pero lleva mucho tiempo, ¿hay una mejor manera de hacerlo?

for files in glob.glob("AM_B0_*.flac.h5"):
    if files[11]=='_':
        year=files[12:16]
        month=files[17:19]
        day= files[20:22]
        hour=files[23:25]
        minute=files[25:27]
        second=files[27:29]
        tindex=pd.date_range(start= '%d-%02d-%02d %02d:%02d:%02d' %(int(year),int(month), int(day), int(hour), int(minute), int(second)), periods=60, freq='10S') 

    else:
        year=files[11:15]
        month=files[16:18]
        day= files[19:21]
        hour=files[22:24]
        minute=files[24:26]
        second=files[26:28]
        tindex=pd.date_range(start= '%d-%02d-%02d %02d:%02d:%02d' %(int(year), int(month), int(day), int(hour), int(minute), int(second)), periods=60, freq='10S')
0
thileepan 15 feb. 2018 a las 09:37

2 respuestas

La mejor respuesta

Pruebe esto (basado en el segundo último '-', no es necesario el caso if-else):

filesall = ['AM_B0_D0.0_2016-04-01T010000.flac.h5',
 'AM_B0_D3.7_2016-04-13T215000.flac.h5',
 'AM_B0_D10.3_2017-03-17T110000.flac.h5',
 'AM_B0_D0.7_2016-10-21T104000.flac.h5',
 'AM_B0_D4.4_2016-08-05T151000.flac.h5',
 'AM_B0_D0.0_2016-04-01T010000.flac.h5',
 'AM_B0_D3.7_2016-04-13T215000.flac.h5',
 'AM_B0_D10.3_2017-03-17T110000.flac.h5',
 'AM_B0_D0.7_2016-10-21T104000.flac.h5',
 'AM_B0_D4.4_2016-08-05T151000.flac.h5']

def find_second_last(text, pattern):
    return text.rfind(pattern, 0, text.rfind(pattern))

for files in filesall:
    start = find_second_last(files,'-') - 4 # from yyyy- part
    timepart = (files[start:start+17]).replace("T"," ")
    #insert 2 ':'s
    timepart = timepart[:13] + ':' + timepart[13:15] + ':' +timepart[15:]
    # print(timepart)
    tindex=pd.date_range(start= timepart, periods=60, freq='10S')
0
Pang 26 oct. 2018 a las 03:53

En lugar de usar el archivo [11] como codificado, vaya al último o al segundo índice de _ y luego use su código, entonces no tiene que escribir 2 veces el mismo código. O use regex para analizar la cadena.

0
Jay Shankar Gupta 15 feb. 2018 a las 06:54