Mes données peuvent avoir plusieurs événements à une date donnée ou AUCUN événement à une date. Je prends ces événements, j'obtiens un décompte par date et je les trace. Cependant, lorsque je les trace, mes deux séries ne correspondent pas toujours.
idx = pd.date_range(df['simpleDate'].min(), df['simpleDate'].max())
s = df.groupby(['simpleDate']).size()
Dans le code ci-dessus, idx devient une plage de 30 dates. 09-01-2013 au 09-30-2013 Cependant S ne peut avoir que 25 ou 26 jours car aucun événement ne s'est produit à une date donnée. J'obtiens alors une AssertionError car les tailles ne correspondent pas lorsque j'essaye de tracer:
fig, ax = plt.subplots()
ax.bar(idx.to_pydatetime(), s, color='green')
Quelle est la bonne façon d'aborder cela? Est-ce que je veux supprimer les dates sans valeurs d' IDX ou (ce que je préfère faire) ajouter à la série la date manquante avec un compte de 0. Je préfère avoir un graphique complet de 30 jours avec 0 valeurs. Si cette approche est correcte, des suggestions sur la façon de commencer? Ai-je besoin d'une sorte de reindex
fonction dynamique ?
Voici un extrait de S ( df.groupby(['simpleDate']).size()
), ne notez aucune entrée pour 04 et 05.
09-02-2013 2
09-03-2013 10
09-06-2013 5
09-07-2013 1
reindex
est une fonction incroyable. Il peut (1) réorganiser les données existantes pour qu'elles correspondent à un nouvel ensemble d'étiquettes, (2) insérer de nouvelles lignes là où aucune étiquette n'existait auparavant, (3) remplir les données pour les étiquettes manquantes, (y compris par remplissage avant / arrière) (4) sélectionner des lignes par label!idx = pd.date_range(df.index.min(), df.index.max())
Une solution de contournement plus rapide consiste à utiliser
.asfreq()
. Cela ne nécessite pas la création d'un nouvel index à appeler.reindex()
.la source
date_range
car il utilise implicitement le premier et le dernier index comme début et fin (ce que vous voudriez presque toujours).Un problème est que
reindex
cela échouera s'il y a des valeurs en double. Supposons que nous travaillions avec des données horodatées, que nous souhaitons indexer par date:rendements
En raison de la
2016-11-16
date en double , une tentative de réindexation:échoue avec:
(cela signifie que l'index a des doublons, non pas qu'il soit lui-même un dup)
Au lieu de cela, nous pouvons utiliser
.loc
pour rechercher des entrées pour toutes les dates de la plage:rendements
fillna
peut être utilisé sur la série de colonnes pour remplir les blancs si nécessaire.la source
Blanks
ouNULLS
?df.loc[all_days]
ne fonctionnera pas dans ce cas.Une autre approche consiste à
resample
gérer les dates en double en plus des dates manquantes. Par exemple:resample
est une opération différée commegroupby
si vous devez la suivre avec une autre opération. Dans ce cas ,mean
fonctionne bien, mais vous pouvez également utiliser d'autres méthodes comme les pandasmax
,sum
etc.Voici les données originales, mais avec une entrée supplémentaire pour '2013-09-03':
Et voici les résultats:
J'ai laissé les dates manquantes en tant que NaNs pour préciser comment cela fonctionne, mais vous pouvez ajouter
fillna(0)
pour remplacer les NaN par des zéros comme demandé par l'OP ou utiliser quelque chose commeinterpolate()
pour remplir avec des valeurs non nulles basées sur les lignes voisines.la source
Voici une méthode intéressante pour remplir les dates manquantes dans un dataframe, avec votre choix de
fill_value
,days_back
pour remplir, et pour trier l'ordre (date_order
) par lequel trier le dataframe:la source