3 votes

Ajout d'une colonne de date répétitive à un DataFrame pandas

Je suis nouveau dans le monde de pandas et j'ai du mal à ajouter des dates à mon dataFrame pandas df qui provient d'un fichier .csv. J'ai un dataFrame avec plusieurs ids uniques, et chaque id a 120 mois, j'ai besoin d'ajouter une colonne date. Chaque identifiant doit avoir exactement les mêmes dates pour 120 périodes. J'ai du mal à les ajouter car après le premier identifiant, il y a un autre identifiant et les dates doivent recommencer à zéro :

month       id   
  1         1593
  2         1593
 ...
 120        1593
  1         8964
  2         8964
 ...
 120        8964
 1          58944
 ...

Voici mon code et je ne suis pas vraiment sûr de la façon dont je dois utiliser la méthode groupby pour ajouter des dates à mon cadre de données en fonction de l'id :

group=df.groupby('id')
group['date']=pd.date_range(start='2020/6/1', periods=120, freq='MS').shift(14,freq='D')

S'il vous plaît, aidez-moi ! !!

0voto

Jonathan Leon Points 3140

Si vous savez combien de séries de 120 vous avez, vous pouvez utiliser ceci. Il suffit de changer le 2 à la fin. Cet exemple crée une répétition de 120 dates deux fois. Vous devrez peut-être l'adapter à votre usage spécifique.

new_dates = list(pd.date_range(start='2020/6/1', periods=120, freq='MS').shift(14,freq='D'))*2

df = pd.DataFrame({'date': new_dates})

0voto

Peter T Walker Points 118

Ce sont les mêmes sauf ceux qui utilisent lambda

def repeatingDates(numIds): return [d.strftime(
    '%Y/%m/%d') for d in pandas.date_range(start='2020/6/1', periods=120, freq='MS')] * numIds

repeatingDates = lambda numIds: [d.strftime(
    '%Y/%m/%d') for d in pandas.date_range(start='2020/6/1', periods=120, freq='MS')] * numIds

0voto

Prayson Daniel Points 938

Vous pouvez utiliser Pandas transform . Voici comment je l'ai résolu :

dataf['dates'] = \
    (dataf
      .groupby("id")
      .transform(lambda d: pd.date_range(start='2020/6/1', periods=d.max(), freq='MS').shift(14,freq='D')
)

Résultats :

   month     id      dates
0      1   1593 2020-06-15
1      2   1593 2020-07-15
2      3   1593 2020-08-15
3      1   8964 2020-06-15
4      2   8964 2020-07-15
5      1  58944 2020-06-15
6      2  58944 2020-07-15
7      3  58944 2020-08-15
8      4  58944 2020-09-15

Données d'essai :

import io
import pandas as pd

dataf = pd.read_csv(io.StringIO("""
month,id
  1,1593
  2,1593
 3,1593
  1,8964
  2,8964
 1,58944
 2,58944
 3,58944
 4,58944""")).astype(int)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X