Есть ли функция python для раскрытия дат (аналогичная List.Dates в мощном запросе)? - PullRequest
3 голосов
/ 19 июня 2020

Используя pandas Я хочу иметь возможность расширить столбец «Дата окончания» столбцом «Количество дней», как показано ниже:

| Employee Code | End Date  | Number Of Days |
|          2501 | 1/9/2020  |              4 |
|          2501 | 1/2/2020  |              1 |
|          2502 | 1/20/2020 |              3 |
|          2503 | 1/15/2020 |              2 |

Ожидаемый результат:

    | Employee Code  | End Date   | Number Of Days  |Expanded date   |
    |  2501          |  1/9/2020  |  4              |  1/9/2020      | 
    |  2501          |  1/9/2020  |  4              |  1/8/2020      | 
    |  2501          |  1/9/2020  |  4              |  1/7/2020      | 
    |  2501          |  1/9/2020  |  4              |  1/6/2020      | 
    |  2501          |  1/2/2020  |  1              |  1/2/2020      | 
    |  2502          |  1/20/2020 |  3              |  1/20/2020     | 
    |  2502          |  1/20/2020 |  3              |  1/19/2020     | 
    |  2502          |  1/20/2020 |  3              |  1/18/2020     | 
    |  2503          |  1/15/2020 |  2              |  1/15/2020     | 
    |  2503          |  1/15/2020 |  2              |  1/14/2020     | 

Есть простой способ сделать это в pandas?

Ответы [ 2 ]

3 голосов
/ 19 июня 2020

Выполните reindex с repeat, затем cumcount получите ожидаемую дату

df=df.reindex(df.index.repeat(df['Number Of Days']))
df['Exp Date']=df['End Date']-pd.to_timedelta(df.groupby(level=0).cumcount(),unit='D')
df
   Employee Code   End Date  Number Of Days   Exp Date
0           2501 2020-01-09               4 2020-01-09
0           2501 2020-01-09               4 2020-01-08
0           2501 2020-01-09               4 2020-01-07
0           2501 2020-01-09               4 2020-01-06
1           2501 2020-01-02               1 2020-01-02
2           2502 2020-01-20               3 2020-01-20
2           2502 2020-01-20               3 2020-01-19
2           2502 2020-01-20               3 2020-01-18
3           2503 2020-01-15               2 2020-01-15
3           2503 2020-01-15               2 2020-01-14
0 голосов
/ 19 июня 2020

Намного более длинный маршрут, чем у @Yoben, с использованием pandas ' date_range с некоторым itertools love:

phase1 = ((code, 
           date, 
           num,
           pd.date_range(end=date,periods=num)[::-1])
          for code, date, num in df.to_numpy()
         )

from itertools import product,chain
flatten = chain.from_iterable
phase2 = flatten(product([rest],expanded_date) for *rest, expanded_date in phase1)
phase3 = [(*rest, expanded) for rest, expanded in phase2]


cols = df.columns.tolist()

cols.append("Expanded Date")
pd.DataFrame(phase3, columns = cols)

Employee Code   End Date    Number Of Days  Expanded Date
0   2501       2020-01-09   4                2020-01-09
1   2501       2020-01-09   4                2020-01-08
2   2501       2020-01-09   4                2020-01-07
3   2501       2020-01-09   4                2020-01-06
4   2501       2020-01-02   1                2020-01-02
5   2502       2020-01-20   3                2020-01-20
6   2502       2020-01-20   3                2020-01-19
7   2502       2020-01-20   3                2020-01-18
8   2503       2020-01-15   2                2020-01-15
9   2503       2020-01-15   2                2020-01-14
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...