parse datetimeindex dates convert python datetime pandas python-datetime

python - datetimeindex - ¿Cómo redondeo la columna de fecha y hora al cuarto de hora más cercano?



series to datetime pandas (4)

He cargado un archivo de datos en un marco de datos de pandas Python. Tengo una columna de fecha y hora del formato 2015-07-18 13:53:33.280 .

Lo que tengo que hacer es crear una nueva columna que redondee esto a su cuarto de hora más cercano. Por lo tanto, la fecha anterior se redondeará a 2015-07-18 13:45:00.000 .

¿Cómo hago esto en pandas? Intenté usar la solución desde aquí , pero obtener un ''Series'' object has no attribute ''year'' error.


Esto se ve un poco mejor

column.dt. permite las funciones de fecha y hora para las columnas de fecha y hora, como column.str. lo hace para columnas tipo cadena

referencia de API de propiedades de tipo datetime

import pandas as pd # test df df = pd.DataFrame([{''old_column'':pd.Timestamp(''2015-07-18 13:53:33.280'')}]) df[''new_column''] = df[''old_column''].dt.round(''15min'') df


La respuesta de Anand S Kumar no se redondea al cuarto de hora más cercano, corta los minutos a los 15 minutos más cercanos debajo de ella.

En realidad, en su ejemplo 2015-07-18 13:53:33.280 debe redondearse a 2015-07-18 14:00:00.000 ya que 53:33.280 está más cerca de 60 minutos que 45 minutos.

Encontré una respuesta más robusta para redondear en esta publicación .

Para su situación, esto debería funcionar:

import datetime def round_time(time, round_to): """roundTo is the number of minutes to round to""" rounded = time + datetime.timedelta(minutes=round_to/2.) rounded -= datetime.timedelta(minutes=rounded.minute % round_to, seconds=rounded.second, microseconds=rounded.microsecond) return rounded dt[''dtcolumn''] = df[''dtcolumn''].apply(lambda x: round_time(x))


Suponiendo que su serie está compuesta de objetos de datetime , debe utilizar Series.apply . Ejemplo -

import datetime df[''<column>''] = df[''<column>''].apply(lambda dt: datetime.datetime(dt.year, dt.month, dt.day, dt.hour,15*(dt.minute // 15)))

El ejemplo anterior para redondear siempre al cuarto de hora anterior (comportamiento similar a la función de piso).

EDITAR

Para redondear al cuarto de hora correcto (como en, si es 7 minutos 30 segundos más allá del trimestre anterior, para mostrar el próximo trimestre). Podemos usar el siguiente ejemplo:

import datetime df[''<column>''] = df[''<column>''].apply(lambda dt: datetime.datetime(dt.year, dt.month, dt.day, dt.hour,15*round((float(dt.minute) + float(dt.second)/60) / 15)))

Lo anterior solo tomaría los últimos segundos en consideración, si desea tener en cuenta el milisegundo / microsegundo, puede agregarlo a la ecuación anterior como - (float(dt.minute) + float(dt.second)/60 + float(dt.microsecond)/60000000)


Puede usar round(freq) . También hay acceso directo column.dt para acceder a las funciones de fecha y hora (como lo sugiere @ laurens-koppenol).

Aquí hay un trazador de líneas:

df[''old column''].dt.round(''15min'')

Los alias de cadenas para frecuencias válidas se pueden encontrar aquí . Ejemplo completo de trabajo:

In [1]: import pandas as pd In [2]: df = pd.DataFrame([pd.Timestamp(''2015-07-18 13:53:33.280''), pd.Timestamp(''2015-07-18 13:33:33.330'')], columns=[''old column'']) In [3]: df[''new column'']=df[''old column''].dt.round(''15min'') In [4]: df Out[4]: old column new column 0 2015-07-18 13:53:33.280 2015-07-18 14:00:00 1 2015-07-18 13:33:33.330 2015-07-18 13:30:00