将日期范围的 df 扩展到每天一行



我有一个 df,每个项目包含一行,其中包含一系列日期,我需要将其扩展为每个项目每天包含一行。

它看起来像这样:

from       to         id
1 25/02/2019 27/02/2019 A
2 15/07/2019 16/07/2019 B

我想要这个:

date       id
1 25/02/2019 A
2 26/07/2019 A
3 27/07/2019 A
4 15/07/2019 B
5 16/07/2019 B

我设法编写了一个有效的代码,但运行需要一个多小时,所以我想知道是否有更有效的方法。

我的代码:

df_dates = pd.DataFrame()
for i in range(len(df)):
start = df.loc[i]['from']
end = df.loc[i]['to'] + np.timedelta64(1,'D') #includes last day of the range
dates = np.arange(start, end, dtype='datetime64[D]')
temp = pd.DataFrame()
temp = temp.append([df.loc[i]]*len(dates), ignore_index=True)
temp['datadate'] = dates
df_dates = df_dates.append(temp, ignore_index=True)

这需要很长时间,因为实际范围约为 50 年,超过 1700 个项目,因此新的 df 非常庞大,但也许您知道一个技巧可以更快地完成相同的工作:)

您可以先转换带有日期to_datetime的列。 然后将itertuplesdate_rangeconcat一起使用以创建新的扩展DataFrame

df['from1'] = pd.to_datetime(df['from'])
df['to1'] = pd.to_datetime(df['to'])
L = [pd.Series(r.id, pd.date_range(r.from1, r.to1)) for r in df.itertuples()]
df1 = pd.concat(L).reset_index()
df1.columns = ['date','id']
print (df1)
date id
0 2019-02-25  A
1 2019-02-26  A
2 2019-02-27  A
3 2019-07-15  B
4 2019-07-16  B

尝试:

df['from'] = pd.to_datetime(df['from'])
df['to'] = pd.to_datetime(df['to'])
pd.concat([pd.DataFrame({'date': pd.date_range(row['from'], row['to'], freq='D'), 'id': row['id']})
for i, row in df.iterrows()], ignore_index=True)
date id
0 2019-02-25  A
1 2019-02-26  A
2 2019-02-27  A
3 2019-07-15  B
4 2019-07-16  B

最新更新