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

2024-10-01 04:53:20 发布

您现在位置: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

如果开始日期从2017年开始,如果2017年介于开始日期和结束日期之间,我想添加1,但如果结束日期是2017年,则为0

我这样做了,它对第一个条件有效,但我不知道如何为其他条件

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

谢谢你的帮助


Tags: 数据lambdadateifvalue条件yearstart
2条回答

首先将列转换为数据帧,按^{}转换为年,并按^{}比较相等,按^{}比较较大,按^{}比较较小,按^{}比较不相等:

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)

最后将所有掩码m1m2按位OR|)和m3按位AND按^}链接在一起,最后按^{}^{}转换为整数:

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

相关问题 更多 >