6
votes

Temps de décalage dans Multi-Index pour fusionner

Je veux fusionner deux jeux de données indexés par temps code> et id code>. Le problème est que le temps est légèrement différent dans chaque ensemble de données. Dans un ensemble de données, le temps (mensuel) est au milieu du mois, donc le 15 de chaque mois. Dans l'autre jeu de données, c'est le dernier jour ouvrable. Cela devrait toujours être un match un à un, mais les dates ne sont pas exactement les mêmes.

Mon approche consiste à déplacer des dates de miois au jour ouvrable des dates de fin de mois. p>

données: p> xxx pré>

sortie: p> xxx pré>

C'est ce que je veux (j'ai enlevé le AVERTISSEMENT DE PERFORMANCE): P>

df.reset_index(inplace=True)
df['date'] = df['date'] + BMonthEnd()
df.set_index(['date','id'], inplace=True)


0 commentaires

3 Réponses :


5
votes

Vous pouvez utiliser set_levels < / code> afin de définir des niveaux multiindex: xxx


3 commentaires

Je suis hors des votes, mais j'ai effacé un et je suis avancé cela parce que j'aime aussi cette solution.


Merci beaucoup apprécié! J'ai aussi aimé votre solution!


C'est une excellente solution propre au problème de la ré-indexation, mais j'ai marqué la solution ci-dessous comme la réponse, car elle a résolu mon problème global de la fusion avec de meilleures performances. En sautant la ré-indexation, il était plus rapide globalement.



5
votes

Vous pouvez simplement le construire à nouveau: xxx

set_levels reconstruit implicitement l'index sous les couvercles. Si vous avez plus de deux niveaux, cette solution devient maltress, alors envisagez d'utiliser set_levels pour taper la brièveté.


1 commentaires

Cela fonctionne aussi bien. Je n'avais pas pensé à cette approche.



2
votes

Depuis que vous souhaitez fusion de toute façon, vous pouvez oublier de modifier l'index et d'utiliser Utiliser pandas.merge_asof () code>

DATA H1>

DF1 code> DF1 code> DF1 code> DF1 CODE > p> xxx pré>

et voici un avec le dernier jour ouvrable du mois, df2 code> p> xxx pré>

Fusionner h1>

Utilisez df1 code> comme gauche dataframe code>, puis choisissez la direction de la fusion comme avant depuis le dernier jour ouvrable après le 15ème. En option, vous pouvez définir une tolérance. Ceci est utile dans la situation où vous manquez un mois dans la droite dataframe code> et vous empêchera de fusionner 03-31-2011 code> à 02-15-2011 code> Si vous manquez des données pour le dernier jour ouvrable de février. P>

                    0_x       0_y
date       id                    
2011-01-15 1  -0.810581 -0.277675
           2   1.177235  0.086539
           3   0.083883  1.441449
2011-02-15 1   1.217419  1.330212
           2  -0.970804 -0.028398
           3   1.262364 -0.114297
2011-03-15 1  -0.026136 -0.031264
           2  -0.036250 -0.787093
           3  -1.103929 -0.133088
2011-04-15 1  -1.303298  0.938732


2 commentaires

C'est excellent - sur mes plus grandes données, cette fusion est plus rapide que de ré-régler l'index puis de la fusionner.


De plus, je voulais garder les dates de fin du mois, donc je viens de changer direction = 'backward' et l'ordre des cadres de données et qui fonctionne.