如何使用python在excel中跨周复制月度数据?

2024-05-26 11:54:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有2016年1月至2020年7月的月度数据。从周一开始,我需要在几周内复制它

我尝试过使用重采样和ffill(),但由于不同城市和汽车的周期相同,我无法使用它

*df = df.resample('W-MON').ffill()*

我得到以下错误:

***ValueError: cannot reindex a non-unique index with a method or limit.***

原始df如下所示:

Car type    num_month   Sales   City    Car model
P       01-01-2016     100     X       A
P       01-02-2016     200     X       A
Q       01-01-2016     223     X       B
Q       01-02-2016     123     X       B
R       01-01-2016     456     X       C
R       01-02-2016     678     X       C
S       01-01-2016     345     X       D
S       01-02-2016     123     X       D
T       01-01-2016     876     X       E
T       01-02-2016     567     X       E
U       01-01-2016     780     X       F
U       01-02-2016     543     X       F
P       01-01-2016     766     Y       A
P       01-02-2016     465     Y       A
Q       01-01-2016     452     Y       B
Q       01-02-2016     1234    Y       B
R       01-01-2016     353     Y       C
R       01-02-2016     566     Y       C
S       01-01-2016     564     Y       D

所需的文件如下所示:

Car type    num_month       Week        Sales    City   Car model
    P       01-01-2016      04-01-2016      100     X       A
    Q       01-01-2016      04-01-2016      223     X       B
    R       01-01-2016      04-01-2016      456     X       C
    U       01-01-2016      04-01-2016      780     X       F
    S       01-01-2016      04-01-2016      345     X       D
    T       01-01-2016      04-01-2016      876     X       E
    P       01-01-2016      11-01-2016      100     X       A
    Q       01-01-2016      11-01-2016      223     X       B
    R       01-01-2016      11-01-2016      456     X       C
    U       01-01-2016      11-01-2016      780     X       F
    S       01-01-2016      11-01-2016      345     X       D
    T       01-01-2016      11-01-2016      876     X       E
    P       01-01-2016      18-01-2016      100     X       A
    Q       01-01-2016      18-01-2016      223     X       B
    R       01-01-2016      18-01-2016      456     X       C
    U       01-01-2016      18-01-2016      780     X       F
    S       01-01-2016      18-01-2016      345     X       D
    T       01-01-2016      18-01-2016      876     X       E
    P       01-01-2016      25-01-2016      100     X       A
    Q       01-01-2016      25-01-2016      223     X       B
    R       01-01-2016      25-01-2016      456     X       C
    U       01-01-2016      25-01-2016      780     X       F
    S       01-01-2016      25-01-2016      345     X       D
    T       01-01-2016      25-01-2016      876     X       E
    P       01-02-2016      01-02-2016      200     X       A
    Q       01-02-2016      01-02-2016      123     X       B
    R       01-02-2016      01-02-2016      678     X       C
    U       01-02-2016      01-02-2016      564     X       F
    S       01-02-2016      01-02-2016      123     X       D
    T       01-02-2016      01-02-2016      567     X       E
    P       01-02-2016      08-02-2016      200     X       A
    Q       01-02-2016      08-02-2016      123     X       B
    R       01-02-2016      08-02-2016      678     X       C
    U       01-02-2016      08-02-2016      564     X       F
    S       01-02-2016      08-02-2016      123     X       D
    T       01-02-2016      08-02-2016      567     X       E
    P       01-02-2016      15-02-2016      200     X       A
    Q       01-02-2016      15-02-2016      123     X       B
    R       01-02-2016      15-02-2016      678     X       C
    U       01-02-2016      15-02-2016      564     X       F
    S       01-02-2016      15-02-2016      123     X       D
    T       01-02-2016      15-02-2016      567     X       E
    P       01-02-2016      22-02-2016      200     X       A
    Q       01-02-2016      22-02-2016      123     X       B
    R       01-02-2016      22-02-2016      678     X       C
    U       01-02-2016      22-02-2016      564     X       F
    S       01-02-2016      22-02-2016      564     X       D
    T       01-02-2016      22-02-2016      567     X       E
    P       01-01-2016      04-01-2016      766     Y       A
    Q       01-01-2016      04-01-2016      452     Y       B
    R       01-01-2016      04-01-2016      353     Y       C
    U       01-01-2016      04-01-2016      456     Y       F
    S       01-01-2016      04-01-2016      564     Y       D
    T       01-01-2016      04-01-2016      230     Y       E
    P       01-01-2016      11-01-2016      766     Y       A
    Q       01-01-2016      11-01-2016      452     Y       B
    R       01-01-2016      11-01-2016      353     Y       C
    U       01-01-2016      11-01-2016      456     Y       F

除此之外,如果一周的开始日期为27或更大,以至于一周的大部分时间都在下一个月,那么该周的数据将仅包括在下一个月,即如果一周的日期为2016年6月29日,则相应的月份或“月数”将为2016年7月1日


Tags: 数据citydfmodeltype错误car汽车
2条回答

我首先创建了一个透视表,这样所有的汽车模型就形成了一个单独的列,从而解决了这个问题。然后对每个城市使用一个for循环,我使用pd.df.resample.ffill()重新采样数据,最后使用melt()取消采样。然而,就上个月而言,我仍然只知道第一周的日期。但这就是我所能得到的

我建议使用datetime包。datetime.date.today().isocalendar()返回今天的年份(2020)、一年中的一周(48)和一周中的一天(6)

在下面,我为每月的每一天复制了一个值。这周你也可以这样做

import datetime

jan_2020_val = 2
feb_2020_val = 3
jan_2021_val = 4
feb_2021_val = 5


curr_date = datetime.date(2020, 1, 1)
end_date = datetime.date(2021, 3, 1)
mydata = []
while curr_date < end_date:
    if curr_date.month == 1 and curr.date.year == 2020:
        mydata.append((curr_date, jan_2020_val))
    if curr_date.month == 2 and curr_date.year == 2020:
        mydata.append((curr_date, feb_2020_val))
    if curr_date.month == 1 and curr_date.year == 2021:
        mydata.append((curr_date, jan_2021_val))
    if curr_date.month == 2 and curr_date.year == 2021:
        mydata.append((curr_date, feb_2021_val)) 
    curr_date += datetime.timedelta(days=1)
print(mydata)

相关问题 更多 >