Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python.loc多个条件并修改部分日期_Python_Datetime_Pandas_Multiple Conditions - Fatal编程技术网

Python.loc多个条件并修改部分日期

Python.loc多个条件并修改部分日期,python,datetime,pandas,multiple-conditions,Python,Datetime,Pandas,Multiple Conditions,我有一个数据框,其中有两个日期列,格式如下: 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/%

我有一个数据框,其中有两个日期列,格式如下:

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')
我知道其中一些有一个错误:DatePose的年份是2010年,DateCollect的年份是2011年。DatePose的年份也应该是2011年。 我想做的事情或多或少是:

cap.loc[(cap.DateCollecte.dt.year == 2011) & (cap.DatePose.dt.year == 2010), cap.DatePose.dt.year] = 2011
我觉得棘手的是我只想改变日期的年份部分。有办法做到这一点吗


在最坏的情况下,因为它只涉及3行不同的日期(但同一年的问题),所以我可以手工操作。

您可以使用掩码并添加
日期偏移量,例如:

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
在一般情况下,您可以使用
apply
动态应用差异:

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