La fusion de données de série chronologique par date à l'aide de numpy/pandas
J'ai le temps de la série de données à partir de trois différentes capteur de sources comme les fichiers CSV et souhaitez les combiner en un seul gros fichier CSV.
J'ai réussi à lire dans numpy utilisation de numpy est genfromtxt, mais je ne suis pas sûr de quoi faire à partir d'ici.
Fondamentalement, ce que j'ai, c'est quelque chose comme ceci:
Tableau 1:
timestamp val_a val_b val_c
Tableau 2:
timestamp val_d val_e val_f val_g
Tableau 3:
timestamp val_h val_i
Tous les timestamps UNIX sont milliseconde horodateurs comme numpy.uint64.
Et ce que je veux est:
timestamp val_a val_b val_c val_d val_e val_f val_g val_h val_i
...où toutes les données sont combinées et commandés par les horodateurs. Chacun des trois tableaux est déjà commandé par horodateur.
Puisque les données proviennent de différentes sources, il n'y a pas de garantie qu'un timestamp à partir de la table 1 sera également dans le tableau 2 ou 3, et vice-versa. Dans ce cas, les valeurs vides doivent être marqués comme N/A.
Jusqu'à présent, j'ai essayé d'utiliser les pandas pour convertir les données comme suit:
df_sensor1 = pd.DataFrame(numpy_arr_sens1)
df_sensor2 = pd.DataFrame(numpy_arr_sens2)
df_sensor3 = pd.DataFrame(numpy_arr_sens3)
et ensuite essayé d'utiliser des pandas.DataFrame.de fusion, mais je suis sûr que cela ne fonctionnera pas pour ce que je suis en train de le faire maintenant. Quelqu'un peut me pointer dans la bonne direction?
merge
, par exemple, il devrait fonctionner si vous n'avez merged = pd.merge(df_sensor1, df_sensor_2, on='timestamp')
et puis répétez l'opération pour df_seonsor3
, ou si vous définissez l'indice d'horodatage pour tous les dfs ensuite, vous pouvez simplement faire pd.concat([df_sensor_1, df_seonsor2, df_sensor3])
Merci pour la réponse rapide! J'ai utilisé
merge
exactement comme vous l'avez écrit, mais qui apparemment n'est une jointure interne, de sorte que seuls les points de données qui ont des horodateurs dans toutes les tables sont écrits à la table fusionnée. J'ai essayé une jointure externe, qui ne comprennent toutes les données, mais aussi ne pas obtenir le droit de la commande. Je n'ai juste essayer concat
. Je n'ai merged = pd.concat([df_sensor1, df_sensor2, df_sensor3], axis=1)
et merged.to_csv('out.csv', sep=';', header=True, index=True, na_rep='N/A')
et qui semble avoir fait le travail. Je vais vérifier ça demain.OriginalL'auteur vind | 2015-08-25
Vous devez vous connecter pour publier un commentaire.
Je pense que vous pouvez tout simplement
timestamp
comme leindex
de chaqueDataFrame
(utilisation deset_index
)join
de les fusionner avec les'outer'
méthodetimestamp
àdatetime
Voici à quoi il ressemble.
join
opérations au sein de lareduce
fonction, sens beaucoup moins de code. Aussi, je crois que lepandas.merge()
va généraliser lejoin()
méthode utilisée ci-dessus. Tout d'abord,from functools import reduce
, puisresult = reduce(lambda left, right: pd.merge(left, right, left_on='timestamp', right_on='timestamp', how='outer'), df_list)
- où le dernier argumentdf_list
une liste de vos DataFrames, par exempledf_list = [df1, df2, df3, ..., df_n]
.OriginalL'auteur Romain