Tengo un marco de datos con una columna int de 4 dígitos:

df['time'].head(10)
0    1844
1    2151
2    1341
3    2252
4    2252
5    1216
6    2334
7    2247
8    2237
9    1651
Name: DepTime, dtype: int64

He verificado que max es 2400 y min es 1. Me gustaría convertir esto en una columna de fecha y hora con horas y minutos. ¿Como podría hacerlo?

0
Odisseo 2 oct. 2019 a las 21:23

4 respuestas

La mejor respuesta

Si estos son 4 dígitos, timedelta es más apropiado que datetime:

pd.to_timedelta(df['time']//100 * 60 + df['time'] % 100, unit='m')

Salida:

0   18:44:00
1   21:51:00
2   13:41:00
3   22:52:00
4   22:52:00
5   12:16:00
6   23:34:00
7   22:47:00
8   22:37:00
9   16:51:00
Name: time, dtype: timedelta64[ns]

Si tiene otra columna date, puede fusionar date y time para crear una columna datetime.

2
Quang Hoang 2 oct. 2019 a las 18:38

Si desea una salida en formato de cadena de HH:MM, solo necesita convertir la columna en cadena y usar str.slice_replace con : ( Nota : cambio su muestra para incluir el caso de un entero de 3 dígitos )

Muestra df:

     time
0    1844
1    2151
2    1341
3    2252
4    2252
5    216
6    2334
7    2247
8    2237
9    1651

s = df['time'].map('{0:04}'.format)
out = s.str.slice_replace(2,2,':')

Out[666]:
0    18:44
1    21:51
2    13:41
3    22:52
4    22:52
5    02:16
6    23:34
7    22:47
8    22:37
9    16:51
Name: time, dtype: object

O dividir y concat con :

s = df['time'].map('{0:04}'.format)
out = s.str[:2] + ':' + s.str[2:]

Out[665]:
0    18:44
1    21:51
2    13:41
3    22:52
4    22:52
5    02:16
6    23:34
7    22:47
8    22:37
9    16:51
Name: time, dtype: object
0
Andy L. 2 oct. 2019 a las 19:08

IIUC

pd.to_datetime(df.time.astype(str),format='%H%M').dt.strftime('%H:%M')
Out[324]: 
0    21:51
1    13:41
2    22:52
3    22:52
4    12:16
5    23:34
6    22:47
7    22:37
8    16:51
Name: col2, dtype: object
0
YOBEN_S 2 oct. 2019 a las 18:39

¡Prueba esto!

df['conversion'] = (df['time'].apply(lambda x: pd.to_datetime(x, format = '%H%M')).dt.strftime('%H:%M'))
0
DarkDrassher34 2 oct. 2019 a las 18:31
58207266