如果生效日期>日期范围,则返回0

时间:2018-12-28 23:00:56

标签: python pandas

我有以下内容:

Admnistação

我正尝试返回df2(行='Amount',列= Date_Range),其中:

df1['Effective_Date']
df1['Amount']

Date_Range = pd.date_range('12/31/2017', periods=150, freq='M')

例如金额= $ 100,生效日期= 3/1/18,则它将在2/28/18及之前返回$ 0,并在3/31 / 18、4 / 30 / 18、5 / 31/18等返回$ 100 < / p>

我要用df1 ['Amount']填充数据框,然后尝试从生效日期之前撤回所有金额:

要创建数据框:

if df1['Effective_Date'] > Date_Range, return 0

要使>有效日期= 0:

df2 = pd.DataFrame(df1['Amount'], columns = Date_Range)

我收到以下错误:

  • 传递的值的形状为(1,1217),索引表示(150,1217)
  • 无法从[datetime64 [ns]]到[int32]键入日期时间

我显然是业余爱好者。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

为此,您可以将df1的“有效日期”列与Date_Range的numpy中的less_equalufunc.outer结合使用,并与“金额”:

import numpy as np
df2 = pd.DataFrame( np.less_equal.outer(df1.Efective_Date, Date_Range)
                                 *df1.Amount.values[:,None], 
                    columns = Date_Range)

以示例:

df1 = pd.DataFrame({'Efective_Date':pd.to_datetime(['01/26/2018', '04/22/2018', '03/28/2018']),
                    'Amount':[100,150,300]})
print(df1)

#   Amount Efective_Date
#0     100    2018-01-26
#1     150    2018-04-22
#2     300    2018-03-28

Date_Range = pd.date_range('01/31/2018', periods=6, freq='M')
print(Date_Range)

#DatetimeIndex(['2018-01-31', '2018-02-28', '2018-03-31', '2018-04-30',
#               '2018-05-31', '2018-06-30'], dtype='datetime64[ns]', freq='M')

那么df2将是:

print (pd.DataFrame( np.less_equal.outer(df1.Efective_Date, Date_Range)
                                  *df1.Amount.values[:,None], 
                     columns = Date_Range))

#   2018-01-31  2018-02-28  2018-03-31  2018-04-30  2018-05-31  2018-06-30
#0         100         100         100         100         100         100
#1           0           0           0         150         150         150
#2           0           0         300         300         300         300