python - nueva - Llenar el marco de datos de pandas continuo a partir de un marco de datos disperso
insertar columna pandas (1)
Tengo un nombre de diccionario date_dict marcado por fechas de fecha y hora con los valores correspondientes a los recuentos de números enteros de las observaciones. Lo convierto en una serie / marco de datos disperso con observaciones censuradas que me gustaría unir o convertir a una serie / dataframe con fechas continuas. La comprensión de la lista desagradable es mi truco para evitar el hecho de que los pandas aparentemente no encubrirán automáticamente los objetos de fecha y hora a un índice DateTime apropiado.
df1 = pd.DataFrame(data=date_dict.values(),
index=[datetime.datetime.combine(i, datetime.time())
for i in date_dict.keys()],
columns=[''Name''])
df1 = df1.sort(axis=0)
Este ejemplo tiene 1258 observaciones y el índice DateTime se ejecuta del 2003-06-24 al 2012-11-07.
df1.head()
Name
Date
2003-06-24 2
2003-08-13 1
2003-08-19 2
2003-08-22 1
2003-08-24 5
Puedo crear un dataframe vacío con un índice continuo de DateTime, pero esto introduce una columna innecesaria y parece torpe. Siento que me falta una solución más elegante que involucre una unión.
df2 = pd.DataFrame(data=None,columns=[''Empty''],
index=pd.DateRange(min(date_dict.keys()),
max(date_dict.keys())))
df3 = df1.join(df2,how=''right'')
df3.head()
Name Empty
2003-06-24 2 NaN
2003-06-25 NaN NaN
2003-06-26 NaN NaN
2003-06-27 NaN NaN
2003-06-30 NaN NaN
¿Existe alguna manera más simple o más elegante de completar un marco de datos continuo a partir de un marco de datos disperso para que haya (1) un índice continuo, (2) los NaN son 0 y (3) no hay una columna vacía en el ¿marco de datos?
Name
2003-06-24 2
2003-06-25 0
2003-06-26 0
2003-06-27 0
2003-06-30 0
Puede usar reindex en una serie temporal usando su rango de fechas. También parece que sería mejor usar un TimeSeries en lugar de un DataFrame (ver documentación ), aunque reindexar también es el método correcto para agregar valores de índice faltantes a DataFrames.
Por ejemplo, comenzando con:
date_index = pd.DatetimeIndex([pd.datetime(2003,6,24), pd.datetime(2003,8,13),
pd.datetime(2003,8,19), pd.datetime(2003,8,22), pd.datetime(2003,8,24)])
ts = pd.Series([2,1,2,1,5], index=date_index)
Te da una serie de tiempo como la cabeza de tu marco de datos de ejemplo:
2003-06-24 2
2003-08-13 1
2003-08-19 2
2003-08-22 1
2003-08-24 5
Simplemente haciendo
ts.reindex(pd.date_range(min(date_index), max(date_index)))
luego le da un índice completo, con NaN para sus valores faltantes (puede usar fillna
si quiere completar los valores perdidos con algunos otros valores - vea aquí ):
2003-06-24 2
2003-06-25 NaN
2003-06-26 NaN
2003-06-27 NaN
2003-06-28 NaN
2003-06-29 NaN
2003-06-30 NaN
2003-07-01 NaN
2003-07-02 NaN
2003-07-03 NaN
2003-07-04 NaN
2003-07-05 NaN
2003-07-06 NaN
2003-07-07 NaN
2003-07-08 NaN
2003-07-09 NaN
2003-07-10 NaN
2003-07-11 NaN
2003-07-12 NaN
2003-07-13 NaN
2003-07-14 NaN
2003-07-15 NaN
2003-07-16 NaN
2003-07-17 NaN
2003-07-18 NaN
2003-07-19 NaN
2003-07-20 NaN
2003-07-21 NaN
2003-07-22 NaN
2003-07-23 NaN
2003-07-24 NaN
2003-07-25 NaN
2003-07-26 NaN
2003-07-27 NaN
2003-07-28 NaN
2003-07-29 NaN
2003-07-30 NaN
2003-07-31 NaN
2003-08-01 NaN
2003-08-02 NaN
2003-08-03 NaN
2003-08-04 NaN
2003-08-05 NaN
2003-08-06 NaN
2003-08-07 NaN
2003-08-08 NaN
2003-08-09 NaN
2003-08-10 NaN
2003-08-11 NaN
2003-08-12 NaN
2003-08-13 1
2003-08-14 NaN
2003-08-15 NaN
2003-08-16 NaN
2003-08-17 NaN
2003-08-18 NaN
2003-08-19 2
2003-08-20 NaN
2003-08-21 NaN
2003-08-22 1
2003-08-23 NaN
2003-08-24 5
Freq: D, Length: 62