我有一个数据帧,在其中我需要与Date列进行比较,并需要获得索引号。
条件:-
-
如果日期==01-06-2018,则获取包含该日期的所有行的索引号。
-
否则将其与该数据帧中的日期进行比较,该日期正好在2018年6月1日之前,该日期为2017年12月1日。
那么现在我们如何使用第二个条件来获得包含2017年12月1日日期的所有行的索引号。
数据帧:-
SR.No Date
1 01-12-2013
1 01-12-2014
1 01-12-2015
1 01-12-2016
1 01-12-2017
1 01-12-2018
1 01-12-2019
1 01-12-2020
1 01-12-2013
1 01-12-2014
1 01-12-2015
1 01-12-2016
1 01-12-2017
1 01-12-2018
1 01-12-2019
1 01-12-2020
2 01-12-2013
2 01-12-2014
2 01-12-2015
2 01-12-2016
2 01-12-2017
2 01-12-2018
2 01-12-2019
2 01-12-2020
2 01-12-2013
2 01-12-2014
2 01-12-2015
2 01-12-2016
2 01-12-2017
2 01-12-2018
2 01-12-2019
2 01-12-2020
您可以创建一个自定义函数:
def getdate(date,df=df):
df=df.copy()
df['Date']=pd.to_datetime(df['Date'],dayfirst=True)
date=pd.to_datetime(date,dayfirst=True)
if df['Date'].eq(date).any():
return df[df['Date'].eq(date)].index
else:
date=(date-pd.DateOffset(months=6))
return df[df['Date'].eq(date)].index
最后:
out=getdate('01-06-2018')
out
:的输出
Int64Index([4, 12, 20, 28], dtype='int64')
解释:
我们正在创建一个函数,该函数检查给定日期(当前为"01-06-2018"(是否等于df['Date']
系列中的日期,并返回布尔系列,我们将该布尔系列传递到数据帧df
中,并使用.index
属性过滤结果和获取索引。如果数据帧中没有行,则会在if
块和else
块中发生这种情况对于我们在if
块中检查的条件,我们正在进行减法运算,或者您也可以说将日期四舍五入到6个月前(通过使用pd.DateOffset()
(,所以现在(您输入的日期(当前为"01-06-2018"(变为"01-12-2017"(因为我们在函数中使用to_datetime()
方法,所以它变为"2017-12-01"(,所以我们正在检查您的数据帧,如果它存在,那么它会给你索引,否则它会给空的系列
函数内每一行的解释:
def getdate(date,df=df):
df=df.copy()
#creating the copy of the dataframe so that the changes made here doesn't reflect in your original dataframe
df['Date']=pd.to_datetime(df['Date'],dayfirst=True)
#converting the Date column to datetime dtype
date=pd.to_datetime(date,dayfirst=True)
#converting the date that you passed when calling the function '01-06-2018' to datetime
if df['Date'].eq(date).any():
#checking if '01-06-2018' is present in 'Date' column
return df[df['Date'].eq(date)].index
#Filtering out result and getting index
else:
#If '01-06-2018' is not present in 'Date' column then
date=(date-pd.DateOffset(months=6))
#Rounding/substracting the 6 months so now date become '2017-12-01'
return df[df['Date'].eq(date)].index
#Filtering out result and getting index
更新:
添加条件后,您的功能变为:
def getdate(date,df=df):
df=df.copy()
df['Date']=pd.to_datetime(df['Date'],dayfirst=True)
date=pd.to_datetime(date,dayfirst=True)
if df['Date'].eq(date).any():
return df[df['Date'].eq(date)].index
else:
to_check=pd.to_datetime(pd.Series(['01-03-18','01-06-2018','01-09-2018']),dayfirst=True)
if to_check.isin([date]).any():
date=pd.to_datetime('01-12-2017',dayfirst=True)
else:
date=(date-pd.DateOffset(months=6))
return df[df['Date'].eq(date)].index