从具有开始日期和结束日期的数据框列生成日期范围



我有以下熊猫数据帧:

12019-01-0112019-01-072019-01-042019-01-012019-01-0722019-01-04
商店 商品 价格 start_date_valid end_date_valid
商店项目1100.002019-01-06
商店项目1120.002019-01-10
商店1 项目2 80.00 2018-12-31 2019-01-03
商店1 项目2 150.002019-01-06
商店2 项目1 105.002019-01-06
商店2 项目1 130.002019-01-10
商店2 item2 85.00 2018-12-31 2019-01-03
商店项目2145.002019-01-06

由于您的数据集很大,因此您必须使用更有效的操作来利用 pandas 矢量化操作。 您可以将list(map())pd.date_range()df.explode()一起使用,如下所示:

df['date'] = list(map(lambda x, y: pd.date_range(start=x, end=y),
df['start_date_valid'], 
df['end_date_valid']))
df = (df.explode('date')
.drop(['start_date_valid', 'end_date_valid'], axis=1))


print(df)
shop   item  price       date
0  shop1  item1  100.0 2019-01-01
0  shop1  item1  100.0 2019-01-02
0  shop1  item1  100.0 2019-01-03
0  shop1  item1  100.0 2019-01-04
0  shop1  item1  100.0 2019-01-05
0  shop1  item1  100.0 2019-01-06
1  shop1  item1  120.0 2019-01-07
1  shop1  item1  120.0 2019-01-08
1  shop1  item1  120.0 2019-01-09
1  shop1  item1  120.0 2019-01-10
2  shop1  item2   80.0 2018-12-31
2  shop1  item2   80.0 2019-01-01
2  shop1  item2   80.0 2019-01-02
2  shop1  item2   80.0 2019-01-03
3  shop1  item2  150.0 2019-01-04
3  shop1  item2  150.0 2019-01-05
3  shop1  item2  150.0 2019-01-06
4  shop2  item1  105.0 2019-01-01
4  shop2  item1  105.0 2019-01-02
4  shop2  item1  105.0 2019-01-03
4  shop2  item1  105.0 2019-01-04
4  shop2  item1  105.0 2019-01-05
4  shop2  item1  105.0 2019-01-06
5  shop2  item1  130.0 2019-01-07
5  shop2  item1  130.0 2019-01-08
5  shop2  item1  130.0 2019-01-09
5  shop2  item1  130.0 2019-01-10
6  shop2  item2   85.0 2018-12-31
6  shop2  item2   85.0 2019-01-01
6  shop2  item2   85.0 2019-01-02
6  shop2  item2   85.0 2019-01-03
7  shop2  item2  145.0 2019-01-04
7  shop2  item2  145.0 2019-01-05
7  shop2  item2  145.0 2019-01-06

list(map())比其他方法快得多,例如df.apply()axis=1.速度可能快 3 倍 ~ 4 倍。 因此,适合您的使用条件。 您可以参考这篇文章,了解有关应用函数的各种方法的系统性能(执行时间)比较的更多信息。

很好,与下面的解决方案相同。

df["daterange"] = df.apply(lambda x: pd.date_range(x.start_date, x.end_date), axis=1)
df = df.explode('daterange').reset_index(drop=True)
print (df)

相关内容

  • 没有找到相关文章

最新更新