为大量数据编写 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
我想优化我的程序,它应该检查日期并写入额外的行,这些行最终将显示 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