Использовать asfreq
, работая с DatetimeIndex
, поэтому сначала set_index
:
#if necessary convert to datetimes
#df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date').asfreq('d', fill_value=0)
print (df)
count
date
2017-11-09 3
2017-11-10 0
2017-11-11 0
2017-11-12 4
2017-11-13 0
2017-11-14 5
Если есть дубликаты DatetimeIndex
, необходимоresample
с некоторой статистической функцией, такой как sum
:
df = df.set_index('date').resample('d').sum()
РЕДАКТИРОВАТЬ, если вам не нужны все комбинации дат:
df = (df.set_index('date').groupby('user')['count']
.apply(lambda x: x.asfreq('d', fill_value=0))
.reset_index())
print (df)
user date count
0 user 1 2017-11-09 3
1 user 1 2017-11-10 0
2 user 1 2017-11-11 0
3 user 1 2017-11-12 4
4 user 1 2017-11-13 0
5 user 1 2017-11-14 5
6 user 2 2017-11-11 2
7 user 2 2017-11-12 6
8 user 2 2017-11-13 0
9 user 2 2017-11-14 7
РЕДАКТИРОВАТЬ1 Для всех комбинаций дат:
mux = pd.MultiIndex.from_product([df['user'].unique(), pd.date_range(df['date'].min(), df['date'].max())],
names=['user','date'])
df = df.set_index(['user', 'date']).reindex(mux, fill_value=0).reset_index()
print (df)
user date count
0 user 1 2017-11-09 3
1 user 1 2017-11-10 0
2 user 1 2017-11-11 0
3 user 1 2017-11-12 4
4 user 1 2017-11-13 0
5 user 1 2017-11-14 5
6 user 2 2017-11-09 0
7 user 2 2017-11-10 0
8 user 2 2017-11-11 2
9 user 2 2017-11-12 6
10 user 2 2017-11-13 0
11 user 2 2017-11-14 7