为大量数据编写 pandas 未来 6 个月的数据框架

Writing data frame for future 6 months in pandas for big amount of data

我想优化我的程序,它应该检查日期并写入额外的行,这些行最终将显示 6 个月的输入日期。例如。如果我的某个 ID 的日期为 2021-01-01,我将连续 6 个月获得具有相同 ID 和日期的行,开始日期为 2021 年 1 月(如下例所示)。

我有一个包含两列的数据框:ID 和 Demand_date,因为它在输入中:

ID         Demand_date
001        2021-01-01
002        2016-03-01
003        2015-10-01

输出应该是这样的:

ID         Demand_date
001        2021-01-01
001        2021-02-01
001        2021-03-01
001        2021-04-01
001        2021-05-01
001        2021-06-01
002        2016-03-01
002        2016-04-01
002        2016-05-01
002        2016-06-01
002        2016-07-01
002        2016-08-01
003        2015-10-01
003        2015-11-01
003        2015-12-01
003        2016-01-01
003        2016-02-01
003        2016-03-01

我的程序中有太多循环,对于 1M 的数据,它花费的时间太长。

给定输入

DF = pd.DataFrame([], columns=["ID","DATE"])
DF["ID"] = ["1","2"]
DF["DATE"] = pd.to_datetime(["2020-01-03","2021-11-22"])

您可以映射一个日期范围,并将其分解为一个新的数据框

temp = DF["DATE"].map(lambda x: pd.date_range(x, periods=3, freq='D')).reset_index()
temp = temp.rename(columns={"index":"ID"})
temp = temp.explode("DATE")
temp

这导致每天重新采样;

我想你可以算出每月重新抽样。
希望对您有所帮助!

您可以使用 pandas.DateOffset:

N = 6
df['Demand_date'] = [[(x+pd.DateOffset(months=i)) for i in range(N)]
                     for x in pd.to_datetime(df['Demand_date'])]
df = df.explode('Demand_date')

输出:

   ID Demand_date
0   1  2021-01-01
0   1  2021-02-01
0   1  2021-03-01
0   1  2021-04-01
0   1  2021-05-01
0   1  2021-06-01
1   2  2016-03-01
1   2  2016-04-01
1   2  2016-05-01
1   2  2016-06-01
1   2  2016-07-01
1   2  2016-08-01
2   3  2015-10-01
2   3  2015-11-01
2   3  2015-12-01
2   3  2016-01-01
2   3  2016-02-01
2   3  2016-03-01

使用嵌套列表理解来创建字典列表并传递给 DataFrame constructor 并通过 offsets.DateOffset 添加新月份:

N = 6

df = pd.DataFrame([{'ID':y, 'Demand_date': x+pd.DateOffset(months=i)} 
                   for y, x in zip(df['ID'], pd.to_datetime(df['Demand_date'])) 
                   for i in range(N)])
print (df)
    ID Demand_date
0    1  2021-01-01
1    1  2021-02-01
2    1  2021-03-01
3    1  2021-04-01
4    1  2021-05-01
5    1  2021-06-01
6    2  2016-03-01
7    2  2016-04-01
8    2  2016-05-01
9    2  2016-06-01
10   2  2016-07-01
11   2  2016-08-01
12   3  2015-10-01
13   3  2015-11-01
14   3  2015-12-01
15   3  2016-01-01
16   3  2016-02-01
17   3  2016-03-01