简体   繁体   English

应用,lambda 函数问题

[英]Apply, lambda function issues

I'm having issues with an if statement and return the difference between two dates using a lambda function with the apply method.我在使用if语句时遇到问题,并使用带有apply方法的lambda函数返回两个日期之间的差异。 ['conus_days'] returns time/days in nanoseconds when the condition is true . ['conus_days']当条件为true时返回时间/天数(以纳秒为单位)。 What's wrong with my code?我的代码有什么问题?

us_bd = CustomBusinessDay(calendar=USFederalHolidayCalendar())

def get_conusdays(row):
   if row['Month']== row['conus_mth']:
       return forecast['Start Date'] - forecast['start_month'].apply(us_bd)
   else:
       return 0

forecast ['conus_days']= forecast.apply(lambda row: get_conusdays(row), axis=1)

print(forecast)

           Name      EID  Start Date   End Date      Country  year  Month  \
0  XX             123456 2019-08-01 2020-01-03            AF  2020      1   
1  XT.            3456789 2019-09-22 2020-02-16        Conus  2020      1   
2  MH.            456789 2019-12-05 2020-03-12        Conus   2020      1   
3  DR.            789456 2019-09-11 2020-03-04         IR     2020      1   
4  JR.            985756 2020-01-03 2020-05-06         GE     2020      1   

   days_in_month start_month  end_month  working_days  hours  conus_mth  \
0             31  2020-01-01 2020-01-31            21    372          8   
1             31  2020-01-01 2020-01-31            21    168          9   
2             31  2020-01-01 2020-01-31            21    168         12   
3             31  2020-01-01 2020-01-31            21    372          9   
4             31  2020-01-01 2020-01-31            21    310          1   

         cd                                         conus_days  
0 -154 days                                                  0  
1 -102 days                                                  0  
2  -28 days                                                  0  
3 -113 days                                                  0  
4    1 days  [-13305600000000000 nanoseconds, -881280000000...

This is because the return of the get_conusdays function is one series and one value(0).这是因为get_conusdays函数的返回是一个系列和一个值 (0)。 You need to unify your return output with a series or value.您需要使用系列或值来统一您的返回输出。

you can try like this:你可以这样尝试:

1. np.where 1. np.where

forecast ['conus_days'] = np.where(forecast['Month']==forecast["conus_mth"],
                                   forecast['Start Date'] - forecast['start_month'].apply(us_bd),
                                   0)

added.添加。

start_date = pd.to_datetime('2020-01-03')
end_date = pd.to_datetime('2020-01-20')
print(len(pd.DatetimeIndex(start=start_date,end=end_date, freq=us_bd)))

>>> 12  #skip US holidays as well as weekends

so,所以,

forecast ['conus_days'] = np.where(forecast['Month']==forecast["conus_mth"],
                                   forecast.apply(lambda row : len(pd.DatetimeIndex(start=row['end_moth'],end=row['End Date'], freq=us_bd)), axis=1),
                                   0)

same problem : Most recent previous business day in Python同样的问题: Python 中最近的前一个工作日

2. apply(your method) 2.申请(你的方法)

def get_conusdays(row):
   if row['Month']== row['conus_mth']:
       return row['Start Date'] - row['start_month'].apply(us_bd)
   else:
       return 0
forecast['conus_days']= forecast.apply(lambda row: get_conusdays(row), axis=1)

If you don't know the CustomBusinessDay exactly and you don't need to apply it to the series, you should do it this way(each row).如果您不完全了解CustomBusinessDay并且不需要将其应用于系列,则应该以这种方式(每行)执行此操作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM