Pandas: вычесть дату на коэффициент, пока не станет больше другой даты - PullRequest
1 голос
/ 26 мая 2020

Как следует из названия, я хочу вычесть коэффициент из даты, пока дата не окажется меньше другой даты.

op_d = {'ADate':[20200301,20200301,20200301,20200301,20200301,20200301],
        'MDate':[20520801,20531001,20550405,20540701,20540910,20510701] ,
        'EDate':[20200201,20200201,20200205,20200101,20190910,20200401] ,
        'Frequency':[2,4,2,6,12,1]}
df = pd.DataFrame(data=op_d)
df['MDate'] = pd.to_datetime(df['MDate'], format='%Y%m%d')
df['ADate'] = pd.to_datetime(df['ADate'], format='%Y%m%d')
df['EDate'] = pd.to_datetime(df['EDate'], format='%Y%m%d')

в приведенном выше фрейме данных я сокращаю количество месяцев («Частота») от «MDate» до тех пор, пока оно не станет меньше «ADate». Ожидаемый результат сохраняется в поле «EDate».

Моя идея состоит в том, чтобы взять разницу в месяцах между «Mdate» и «ADate», затем разделить ее по частоте и удалить остаток из «ADate», что является длительным процессом.

df['tempDate'] = df.apply(lambda x: x['MDate'] - pd.DateOffset(months = x['Frequency'])  , axis=1)

Приведенный выше код вычитает частоту только один раз. есть ли способ запустить это через некоторое время l oop для каждой строки или что-то в этом роде? т.е.

df['tempDate'] = df.apply(lambda x: x['MDate'] - pd.DateOffset(months = x['Frequency'])  if df['tempDate'] < ['ADate'] , axis=1)

1 Ответ

1 голос
/ 26 мая 2020

Вы можете составить функцию, а затем применить:

def reduce(row):
    a,m,f = row[['ADate','MDate','Frequency']]
    offset = pd.DateOffset(months=f)
    while m > a: m -= offset
    return m

df['EDate'] = df.apply(reduce, axis=1)

Вывод:

       ADate      MDate      EDate  Frequency
0 2020-03-01 2052-08-01 2020-02-01          2
1 2020-03-01 2053-10-01 2020-02-01          4
2 2020-03-01 2055-04-05 2020-02-05          2
3 2020-03-01 2054-07-01 2020-01-01          6
4 2020-03-01 2054-09-10 2019-09-10         12
5 2020-03-01 2051-07-01 2020-03-01          1
...