2016-04-05 5 views
1

J'ai un dataframe avec (entre autres) deux colonnes de date formatée comme ceci:Python pandas géants .loc multiples conditions et modifier une partie de la date

cap['DateCollecte'] = pd.to_datetime(cap['Date de collecte']+' '+cap['Heure de collecte'],format='%d/%m/%Y %H:%M:%S',errors='coerce') 
cap['DatePose'] = pd.to_datetime(cap['Date de pose']+' '+cap['Heure de pose'],format='%d/%m/%Y %H:%M:%S',errors='coerce') 

Je sais que certains d'entre eux ont une erreur: l'année de DatePose est 2010 et l'année de DateCollecte est 2011. L'année de DatePose devrait être 2011 aussi. L'idée de ce que je voudrais faire est plus ou moins:

cap.loc[(cap.DateCollecte.dt.year == 2011) & (cap.DatePose.dt.year == 2010), cap.DatePose.dt.year] = 2011 

Je pense que la partie la plus délicate est que je veux juste changer la partie année de la date. Y a-t-il un moyen de faire cela?

Dans le pire des cas, puisqu'il ne s'agit que de 3 lignes avec des dates différentes (mais problème de la même année) je pourrais le faire à la main.

Répondre

1

Vous pouvez utiliser votre masque et ajouter un DateOffset, par exemple:

In [43]: 
df=pd.DataFrame({'a':pd.date_range(dt.datetime(2011,1,1), dt.datetime(2012,1,1), freq='M'), 'b':pd.date_range(dt.datetime(2010,6,1), dt.datetime(2011,6,1), freq='M')}) 
df 

Out[43]: 
      a   b 
0 2011-01-31 2010-06-30 
1 2011-02-28 2010-07-31 
2 2011-03-31 2010-08-31 
3 2011-04-30 2010-09-30 
4 2011-05-31 2010-10-31 
5 2011-06-30 2010-11-30 
6 2011-07-31 2010-12-31 
7 2011-08-31 2011-01-31 
8 2011-09-30 2011-02-28 
9 2011-10-31 2011-03-31 
10 2011-11-30 2011-04-30 
11 2011-12-31 2011-05-31 

In [65]: 
df.loc[(df['a'].dt.year == 2011) & (df['b'].dt.year == 2010), 'b'] = df['b'] + pd.DateOffset(years=1) 
df 

Out[65]: 
      a   b 
0 2011-01-31 2011-06-30 
1 2011-02-28 2011-07-31 
2 2011-03-31 2011-08-31 
3 2011-04-30 2011-09-30 
4 2011-05-31 2011-10-31 
5 2011-06-30 2011-11-30 
6 2011-07-31 2011-12-31 
7 2011-08-31 2011-01-31 
8 2011-09-30 2011-02-28 
9 2011-10-31 2011-03-31 
10 2011-11-30 2011-04-30 
11 2011-12-31 2011-05-31 

Dans le cas général, vous pouvez utiliser apply pour appliquer dynamiquement la différence:

In [69]: 
df['b'] = df.apply(lambda x: x['b'] + pd.DateOffset(years=x['a'].year-x['b'].year), axis=1) 
df 

Out[69]: 
      a   b 
0 2011-01-31 2011-06-30 
1 2011-02-28 2011-07-31 
2 2011-03-31 2011-08-31 
3 2011-04-30 2011-09-30 
4 2011-05-31 2011-10-31 
5 2011-06-30 2011-11-30 
6 2011-07-31 2011-12-31 
7 2011-08-31 2011-01-31 
8 2011-09-30 2011-02-28 
9 2011-10-31 2011-03-31 
10 2011-11-30 2011-04-30 
11 2011-12-31 2011-05-31