您可以使用concat http://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html all Series
是由创建的date_range http://pandas.pydata.org/pandas-docs/stable/generated/pandas.date_range.html with itertuples http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.itertuples.html进而join http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.join.html列promo
and item
:
df1 = pd.concat([pd.Series(r.Index,
pd.date_range(r.start_date,r.end_date)) for r in df.itertuples()])
.reset_index()
df1.columns = ['date','idx']
df1 = df1.set_index('idx')
df1 = df1.join(df[['item','promo']]).reset_index(drop=True)
print (df1)
date item promo
0 2015-01-08 A Buy1-get 1
1 2015-01-09 A Buy1-get 1
2 2015-01-10 A Buy1-get 1
3 2015-01-11 A Buy1-get 1
4 2015-01-12 A Buy1-get 1
5 2015-02-16 A Buy1-get 1
6 2015-02-17 A Buy1-get 1
7 2015-02-18 A Buy1-get 1
8 2015-02-19 A Buy1-get 1
9 2015-02-20 A Buy1-get 1
10 2016-05-08 B Buy1-40% off
11 2016-05-09 B Buy1-40% off
另一种解决方案是melt http://pandas.pydata.org/pandas-docs/stable/generated/pandas.melt.html and 通过重采样进行分组 http://pandas.pydata.org/pandas-docs/stable/whatsnew.html#groupby-syntax-with-window-and-resample-operations:
df1 = df.reset_index().rename(columns={'index':'idx'})
df1 = pd.melt(df1, id_vars='idx', value_vars=['start_date','end_date'], value_name='date')
.set_index('date')
df1 = df1.groupby('idx')
.resample('d')
.ffill()
.reset_index(level=1)
.drop(['idx','variable'], axis=1)
df1 = df1.join(df[['item','promo']]).reset_index(drop=True)
print (df1)
date item promo
0 2015-01-08 A Buy1-get 1
1 2015-01-09 A Buy1-get 1
2 2015-01-10 A Buy1-get 1
3 2015-01-11 A Buy1-get 1
4 2015-01-12 A Buy1-get 1
5 2015-02-16 A Buy1-get 1
6 2015-02-17 A Buy1-get 1
7 2015-02-18 A Buy1-get 1
8 2015-02-19 A Buy1-get 1
9 2015-02-20 A Buy1-get 1
10 2016-05-08 B Buy1-40% off
11 2016-05-09 B Buy1-40% off