Пандам даны даты начала и окончания, они объединяются в еженедельную частоту и считаются - PullRequest
1 голос
/ 24 октября 2019

У меня есть начальные и конечные данные, определяющие период. Я хочу объединить такие периоды в неделю и подсчитать количество дней, выделенных на каждую неделю.

Я думаю, что я должен использовать pd.cut с еженедельными корзинами. Я думаю сначала преобразовать периоды в столбец дат. Затем используйте group by id и resample для подсчета. Я застрял в конвертируемых периодах в ежедневную колонку.

Я изо всех сил пытаюсь получить желаемые результаты, следуя Расширение фрейма данных pandas с диапазоном дат в столбцах

# dataframe
prod_id = ['a', 'a', 'b', 'c']
start_date = ['2019-01-15',  '2019-08-10', '2019-06-15',  '2019-07-10']
end_date = ['2019-01-28',  '2019-08-15', '2019-07-15',  '2019-07-22']
d = {'id': prod_id, 'start': start_date, 'end': end_date}
df = pd.DataFrame.from_dict(d)
df = df[['id', 'start', 'end']]
df['start'] = pd.to_datetime(df['start'])
df['end'] = pd.to_datetime(df['end'])

# bins
freq = 'W'
bins = pd.date_range(pd.to_datetime('2018-10-01'), pd.to_datetime('2019-10-20'), freq=freq).tolist()   

ожидаемые результаты - что-то вроде

enter image description here

1 Ответ

1 голос
/ 24 октября 2019

ОК, я думаю, что придумаю один способ обойти это. Не элегантный, так что все еще жду лучшего решения. (особенно предпочитают не повторять выборку ежедневно)

после Расширение фрейма данных pandas с диапазоном дат в столбцах

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

prod_id = ['a', 'a', 'b', 'c']
# add this to differetiate prod_id "a" 
num_id = [1, 2, 3, 4]
start_date = ['2019-01-15',  '2019-08-10', '2019-06-15',  '2019-07-10']
end_date = ['2019-01-28',  '2019-08-15', '2019-07-15',  '2019-07-22']
d = {'id': prod_id, 'nd': num_id, 'start': start_date, 'end': end_date}
df = pd.DataFrame.from_dict(d)
df = df[['id', 'nd', 'start', 'end']]
df['start'] = pd.to_datetime(df['start'])
df['end'] = pd.to_datetime(df['end'])    


df_melt = df.melt(id_vars=['id', 'nd'],value_name='date')
# first aggregate to daily
df_aggr_D = df_melt.groupby(['id', 'nd']).apply(lambda x: x.set_index('date').resample('D').pad()).drop(columns=['id','nd', 'variable']).reset_index()
df_aggr_D.drop(columns=['nd'], inplace=True)
# the aggregate to weekly
df_aggr_W = df_aggr_D.set_index('date').groupby('id').resample('W').count()
df_aggr_W.loc[df_aggr_W['id']!=0].rename(columns={'id':'count'})

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...