【问题标题】:Apply, lambda function issues应用,lambda 函数问题
【发布时间】:2019-12-24 13:10:40
【问题描述】:

我遇到了if 语句的问题,并使用lambda 函数和apply 方法返回两个日期之间的差异。当条件为true 时,['conus_days'] 以纳秒为单位返回时间/天数。我的代码有什么问题?

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...

【问题讨论】:

  • 我认为您可以直接将get_conusdays 传递给apply,如下所示:forecast.apply(get_conusdays, axis=1)

标签: python pandas lambda apply


【解决方案1】:

这是因为get_conusdays函数的返回是一个系列和一个值(0)。 您需要将返回输出与系列或值统一起来。

你可以这样试试:

1。 np.where

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

已添加。

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

所以,

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)

同样的问题:Most recent previous business day in Python

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)

如果您不完全了解CustomBusinessDay 并且不需要将其应用于系列,则应该这样做(每一行)。

【讨论】:

  • yganalyst - 在方法 1 (np.where) 中,您知道为什么 custombusinessday 在某些情况下不会抵消周末。例如,如果您采用上面的示例并将其替换为 forecast['end_month] - Forecast['End Date'].apply(us_bd),您将获得这两个时间段之间的天数减去假期,而不是周末.我该如何纠正这个问题?
  • 抱歉回复晚了。我更新了我的答案。希望对您有所帮助,如果您需要更多帮助,请告诉我。
猜你喜欢
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
相关资源
最近更新 更多