Rounding Pandas Timestamp a minutos

Quiero crear un DateTimeIndex a intervalos de 1 minuto en función de una marca de tiempo de inicio y finalización (dada en microsegundos desde la época) con pd_date_range() . Para hacer esto, necesito redondear la marca de tiempo inicial hacia arriba y la marca de tiempo final hacia abajo. Aquí está lo que tengo hasta ahora:

 import pandas as pd start = 1406507532491431 end = 1406535228420914 start_ts = pd.to_datetime(start, unit='us') # Timestamp('2014-07-28 00:32:12.491431') end_ts = pd.to_datetime(end, unit='us') # Timestamp('2014-07-28 08:13:48.420914') 

Quiero redondear:

start_ts to Timestamp('2014-07-28 00:32') y

end_ts to Timestamp('2014-07-28 08:14') .

¿Cómo puedo hacer esto?

Hacer esto en un método simple es actualmente un problema pendiente aquí

 In [22]: start = 1406507532491431 In [23]: end = 1406535228420914 [26]: dti = pd.to_datetime([start,end],unit='us') In [27]: dti Out[27]:  [2014-07-28 00:32:12.491431, 2014-07-28 08:13:48.420914] Length: 2, Freq: None, Timezone: None In [29]: pd.DatetimeIndex(((dti.asi8/(1e9*60)).round()*1e9*60).astype(np.int64)) Out[29]:  [2014-07-28 00:32:00, 2014-07-28 08:14:00] Length: 2, Freq: None, Timezone: None 

Sin embargo, es bastante sencillo.

Las solicitudes de extracción para implementar son bienvenidas.

A partir de la versión 0.18, Pandas ha incorporado una funcionalidad de redondeo similar a la fecha y hora :

 start_ts.round('min') # Timestamp('2014-07-28 00:32:00') end_ts.round('min') # Timestamp('2014-07-28 08:14:00') 

También puede usar .ceil o .floor si necesita forzar el redondeo hacia arriba o hacia abajo.


EDITAR : El código anterior funciona con raw pd.Timestamp , según lo solicitado por el OP. En caso de que esté trabajando con un pd.Series , use el acceso dt :

 s = pd.Series(pd.to_datetime([1406507532491431000, 1406535228420914000])) s.dt.round('min') 

Salida:

 0 2014-07-28 00:32:00 1 2014-07-28 08:14:00 dtype: datetime64[ns] 

Tuve un problema similar, con ganas de redondear el día. Resulta que hay una manera fácil (funciona para Y [oído] M [mes] D [ay], h [nuestro], m [inute], s [econd]). Suponiendo que df es un DataFrame de pandas con una columna ‘datecol’:

 df['datecol'] = df['datecol'].values.astype(' 

Lo redondeará a la m [inute]. Dado que encontré esta pregunta originalmente, pensé que enlazaría la respuesta que recibí, ya que me parece relevante.

Manera más eficiente de redondear las marcas de tiempo del día usando pandas

Como @ usuario 3735204 declaró, es posible redondear una columna con:

 df['datecol'] = df['datecol'].astype('datetime64[m]') 

donde la unidad entre corchetes podría ser:

 Y[ear] M[month] D[ay], h[our], m[inute], s[econd] 

También es posible redondear a la más cercana ( referencia ) haciendo la columna como índice y aplicando el método de ronda (disponible en pandas 0.19.0):

 df.index = pd.to_datetime(df['datecol']) df.index = df.index.round("S") 

Ejemplo:

 df = pd.DataFrame(data = tmpdata) df['datecol'] = df['datecol'].astype('datetime64[s]') print df['datecol'] 0 2016-10-05 05:37:42 1 2016-10-05 05:37:43 Name: datecol, dtype: datetime64[ns] df.index = pd.to_datetime(df['datecol']) df.index = df.index.round("S") print df.index DatetimeIndex(['2016-10-05 05:37:43', '2016-10-05 05:37:43'], dtype='datetime64[ns]', name=u'timestamp', freq=None) 
 import pandas as pd new_index = pd.date_range(start=start_ts.strftime('%Y-%m-%d %H:%M'), end=end_ts.strftime('%Y-%m-%d %H:%M'), freq='1min')