Рассчитать список дат в столбце Pandas - PullRequest
2 голосов
/ 06 марта 2020

У меня есть Pandas фрейм данных, включая столбец с двумя датами в datetime. И я хочу сгенерировать список дат в этом ярости в виде нового столбца, чтобы потом можно было разбить запись на несколько строк.

Я попробовал следующее понимание списка.

orders_df['list_of_dates'] = [orders_df['start_date'] + timedelta(days=n) for n in range(orders_df['date_difference'])]

Но было получено следующее сообщение

TypeError: объект 'Series' нельзя интерпретировать как целое число

Любые мысли о решении будут высоко оценены.

1 Ответ

2 голосов
/ 06 марта 2020

Используйте понимание вложенного списка с range:

from datetime import timedelta

rng = pd.date_range('2017-04-03', periods=5)
orders_df = pd.DataFrame({'start_date': rng, 'date_difference': 2})  

orders_df['list_of_dates'] = [[d + timedelta(days=x) for x in range(n)] 
                                      for d, n 
                                      in zip(orders_df['start_date'],
                                             orders_df['date_difference'])]

print (orders_df)
  start_date  date_difference                               list_of_dates
0 2017-04-03                2  [2017-04-03 00:00:00, 2017-04-04 00:00:00]
1 2017-04-04                2  [2017-04-04 00:00:00, 2017-04-05 00:00:00]
2 2017-04-05                2  [2017-04-05 00:00:00, 2017-04-06 00:00:00]
3 2017-04-06                2  [2017-04-06 00:00:00, 2017-04-07 00:00:00]
4 2017-04-07                2  [2017-04-07 00:00:00, 2017-04-08 00:00:00]

При необходимости возможен также новый столбец, используйте Index.repeat с GroupBy.cumcount для счетчика Серии, преобразованные в timedeltas на to_timedelta:

df = orders_df.loc[orders_df.index.repeat(orders_df['date_difference'])]
g = df.groupby(level=0).cumcount()
df['new'] = df['start_date'] + pd.to_timedelta(g, unit='d')
df = df.reset_index(drop=True)
print (df)
  start_date  date_difference        new
0 2017-04-03                2 2017-04-03
1 2017-04-03                2 2017-04-04
2 2017-04-04                2 2017-04-04
3 2017-04-04                2 2017-04-05
4 2017-04-05                2 2017-04-05
5 2017-04-05                2 2017-04-06
6 2017-04-06                2 2017-04-06
7 2017-04-06                2 2017-04-07
8 2017-04-07                2 2017-04-07
9 2017-04-07                2 2017-04-08
...