pandas: cómo organizar el dataframe según la fecha y asignar nuevos valores a la columna

Tengo un período de datos de un mes, excepto sábado y domingo, que se registra cada 1 minuto.

v1 v2 2017-04-03 09:15:00 35.7 35.4 2017-04-03 09:16:00 28.7 28.5 ... ... ... 2017-04-03 16:29:00 81.7 81.5 2017-04-03 16:30:00 82.7 82.6 ... ... ... 2017-04-04 09:15:00 24.3 24.2 2017-04-04 09:16:00 25.6 25.5 ... ... ... 2017-04-04 16:29:00 67.0 67.2 2017-04-04 16:30:00 70.2 70.6 ... ... ... 2017-04-28 09:15:00 31.7 31.4 2017-04-28 09:16:00 31.5 31.0 ... ... ... 2017-04-28 16:29:00 33.2 33.5 2017-04-28 16:30:00 33.0 30.7 

He vuelto a muestrear el dataframe para obtener el primer y último valor de cada día.

 res = df.groupby(df.index.date).apply(lambda x: x.iloc[[0, -1]]) res.index = res.index.droplevel(0) print(res) v1 v2 2017-04-03 09:15:00 35.7 35.4 2017-04-03 16:30:00 82.7 82.6 2017-04-04 09:15:00 24.3 24.2 2017-04-04 16:30:00 70.2 70.6 ... .. .. 2017-04-28 09:15:00 31.7 31.4 2017-04-28 16:30:00 33.0 30.7 

Ahora quiero tener el dataframe organizado como fecha con v1 de marca de tiempo mínima y v2 de marca de hora máxima de fecha específica.

Salida deseada:

  v1 v2 2017-04-03 35.7 82.6 2017-04-04 24.3 70.6 ... .. .. 2017-04-28 31.7 30.7 

Puede agrupar en el índice y usar groupby.agg con una función personalizada.

 df1 = res.groupby(res.index.date).agg({'v1': lambda x: x[min(x.index)], 'v2':lambda x: x[max(x.index)]}) print (df1) v1 v2 2017-04-03 35.7 82.6 2017-04-04 24.3 70.6 2017-04-28 31.7 33.7 

Una alternativa para remuestrear el dataframe para obtener el primer y último valor de cada día.

 res=df.reset_index().groupby(df.index.date).agg(['first','last']).stack().set_index('index') Out[123]: v1 v2 index 2017-04-03 09:15:00 35.7 35.4 2017-04-03 16:30:00 82.7 82.6 2017-04-04 09:15:00 24.3 24.2 2017-04-04 16:30:00 70.2 70.6 2017-04-28 09:15:00 31.7 31.4 2017-04-28 16:30:00 33.0 33.7 

Prueba esto:

 df_result = pd.DataFrame() df_result['v1'] = res.groupby(res.index)['v1'].min() df_result['v2'] = res.groupby(res.index)['v2'].max() 

Hay una función muy interesante en pandas para trabajar con el índice de fecha y hora. Es la función de remuestreo. En tu caso prueba esto:

 def first_last(entry): return entry['v1'][0],entry['v2'][1] yourdataframe.resample('D').apply(first_last) 

la ‘D’ significa remuestreo diario.

resultado:

 Dates 2017-04-03 35.7 82.6 2017-04-04 24.3 70.6 

Puedes reset_index y luego apply GroupBy + con una función personalizada:

 def first_second(x): return pd.Series({'v1': x['v1'].iat[0], 'v2': x['v2'].iat[-1]}) res2 = res.reset_index() res2 = res2.groupby(res2['index'].dt.date).apply(first_second) print(res2) v1 v2 index 2017-04-03 35.7 82.6 2017-04-04 24.3 70.6 2017-04-28 31.7 33.7