Pandas - 日期范围内每一天的新行

Jac*_*ack 5 python pandas

我有一个 Pandas df,其中一列 (Reservation_Dt_Start) 表示日期范围的开始,另一列 (Reservation_Dt_End) 表示日期范围的结束。

我不想每行都有一个日期范围,而是希望扩展每行以包含与日期范围中的日期一样多的记录,每个新行代表这些日期之一。

请参阅下面的两张图片,了解示例输入和所需的输出。

输入输出

下面的代码片段有效!但是,对于输入表中的每 250 行,运行时间为 1 秒。鉴于我的输入表大小为 120,000,000 行,此代码将需要大约一周的时间才能运行。

pd.concat([pd.DataFrame({'Book_Dt': row.Book_Dt,
                         'Day_Of_Reservation': pd.date_range(row.Reservation_Dt_Start, row.Reservation_Dt_End),
                         'Pickup': row.Pickup,
                         'Dropoff' : row.Dropoff,
                         'Price': row.Price}, 

                          columns=['Book_Dt','Day_Of_Reservation', 'Pickup', 'Dropoff' , 'Price']) 
                          for i, row in df.iterrows()], ignore_index=True)
Run Code Online (Sandbox Code Playgroud)

必须有一种更快的方法来做到这一点。有任何想法吗?谢谢!

ted*_*ddy 4

pd.concat在具有大数据集的循环中变得非常慢,因为它每次都会复制帧并返回一个新的数据帧。您正尝试执行此操作 120m 次。我会尝试将这些数据作为简单的元组列表来处理,然后在最后转换为数据帧。

例如

给定一个列表list = []

对于数据框中的每一行:

  • 获取日期范围列表(pd.date_range仍然可以在此处使用)存储在变量中,dates该变量是日期列表

  • 对于日期范围内的每个日期,将一个元组添加到列表中list.append((row.Book_Dt, dates[i], row.Pickup, row.Dropoff, row.Price))

最后,您可以将元组列表转换为数据框:

df = pd.DataFrame(list, columns = ['Book_Dt', 'Day_Of_Reservation', 'Pickup', 'Dropoff', 'Price'])