Python 在数据框中每周递增日期

Python to increment date every week in a dataframe

我正在努力满足这个要求,我需要以周为单位增加日期,下面是相同的代码:

import pandas as pd
import numpy as np
c=15
s={'week':[1,2,3,4,5,6,7,8],'Sales':[10,20,30,40,50,60,70,80]}
p=pd.DataFrame(data=s)
p['week'] =p['week'].apply(
    lambda x: datetime.datetime.strptime(f'2021-{x:02}-1', '%Y-%U-%u')
)

O/P-

我怎样才能从周列的最后一行递增到接下来的 15 周?

基本上,一周的期望输出从 2022-03-01 开始到接下来的 14 周。

一种选择是使用 date_range 生成额外的日期,然后使用 set_index + reindex 附加它们:

p = p.set_index('week').reindex(pd.date_range('2021-01-04', periods=8+14, freq='W-MON')).rename_axis(['week']).reset_index()

输出:

         week  Sales
0  2021-01-04   10.0
1  2021-01-11   20.0
2  2021-01-18   30.0
3  2021-01-25   40.0
4  2021-02-01   50.0
5  2021-02-08   60.0
6  2021-02-15   70.0
7  2021-02-22   80.0
8  2021-03-01    NaN
9  2021-03-08    NaN
10 2021-03-15    NaN
11 2021-03-22    NaN
12 2021-03-29    NaN
13 2021-04-05    NaN
14 2021-04-12    NaN
15 2021-04-19    NaN
16 2021-04-26    NaN
17 2021-05-03    NaN
18 2021-05-10    NaN
19 2021-05-17    NaN
20 2021-05-24    NaN
21 2021-05-31    NaN

您可以使用 range() 函数和您的变量 c 修改 week 列表的长度,但您还将检查 sales 的长度,这必须具有相同数量的元素:

import pandas as pd
import numpy as np
import datetime

c=15
weeks = list(range(1, c+1))
sales = [10,20,30,40,50,60,70,80]

s={'week':weeks,'Sales':sales+[None]*(len(weeks)-len(sales) if (len(weeks)-len(sales)) >=0 else 0)}
p=pd.DataFrame(data=s)
p['week'] =p['week'].apply(
    lambda x: datetime.datetime.strptime(f'2021-{x:02}-1', '%Y-%U-%u')
)
print(p)

DateOffset中的另一个选项:

p = pd.concat([p, pd.DataFrame({'week': [p.iloc[-1,0]+pd.DateOffset(weeks=i) for i in range(1,c)]})], ignore_index=True)

>>> p
'''
         week  Sales
0  2021-01-04   10.0
1  2021-01-11   20.0
2  2021-01-18   30.0
3  2021-01-25   40.0
4  2021-02-01   50.0
5  2021-02-08   60.0
6  2021-02-15   70.0
7  2021-02-22   80.0
8  2021-03-01    NaN
9  2021-03-08    NaN
10 2021-03-15    NaN
11 2021-03-22    NaN
12 2021-03-29    NaN
13 2021-04-05    NaN
14 2021-04-12    NaN
15 2021-04-19    NaN
16 2021-04-26    NaN
17 2021-05-03    NaN
18 2021-05-10    NaN
19 2021-05-17    NaN
20 2021-05-24    NaN
21 2021-05-31    NaN