如果特定年份介于两个日期之间,则返回值python



我有一个数据帧elec2:

Start_Date  End_Date    
0   2014-05-16  2015-05-18  
1   2015-05-19  2018-05-13  
2   2016-05-14  2017-05-12  
3   2017-05-13  2018-05-16  
4   2018-05-17  2019-05-14  

预期输出:

Start_Date  End_Date    Value
0   2014-05-16  2017-05-18  0
1   2015-05-19  2018-05-13  1
2   2016-05-14  2017-05-12  0
3   2017-05-13  2018-05-16  1
4   2018-05-17  2019-05-14  0

如果start_date从2017年开始,如果2017年在start_date和End_date之间,我想加1,但如果End_date是2017年,那么它是0。

我做了这个,它对第一种情况有效,但我不知道如何治疗其他情况。

elec2["Value"]=elec2.apply(lambda x: 1 if (x["Start_Date"].year==2017)
else
0,axis=1)

谢谢你的帮助。

首先将列转换为DataFrames,通过Series.dt.year转换为年份,然后通过Series.eq进行比较以表示相等,Series.gt表示较大,Series.lt表示较小,Series.ne表示不相等:

df['Start_Date'] = pd.to_datetime(df['Start_Date'])
df['End_Date'] = pd.to_datetime(df['End_Date'])
s = df['Start_Date'].dt.year
e = df['End_Date'].dt.year
m1 = s.eq(2017)
m2 = s.lt(2017) & e.gt(2017)
m3 = e.ne(2017)

最后将m1m2OR(|(和m3链在一起,AND&链在一起并最后通过Series.astypeSeries.view转换为整数:

df['Value'] =  ((m1 | m2) & m3).astype(int)
#alternative
#df['Value'] =  ((m1 | m2) & m3).view('i1')
print (df)
Start_Date   End_Date  Value
0 2014-05-16 2015-05-18      0
1 2015-05-19 2018-05-13      1
2 2016-05-14 2017-05-12      0
3 2017-05-13 2018-05-16      1
4 2018-05-17 2019-05-14      0

与@jezrael的答案略有不同:

df['Value'] = ((pd.DatetimeIndex(df['Start_Date']).year <= 2017) & (pd.DatetimeIndex(df['End_Date']).year > 2017))*1

或者当您的DataFrame已经是DateTime对象时:

df['Value'] = ((df.iloc[:, 0].dt.year <= 2017) & (df.iloc[:, 1].dt.year > 2017))*1

您也可以使用.astype(int)而不是*1

我仍然掌握着Python的窍门,上面的内容可能会更像Python。。。

最新更新