Python 遍历日期范围,找出每组的总和

Python 遍历日期范围,找出每组的总和,python,pandas,dataframe,numpy,datetime,Python,Pandas,Dataframe,Numpy,Datetime,我有一个数据框,看起来像这样: ID Date Volume Sales 0 1 2019-01-01 3.333333 1.333333 1 1 2019-02-01 3.333333 1.333333 2 1 2019-03-01 3.333333 1.333333 3 1 2019-04-01 2.666667 2.000000 4 1 2019-05-01 2.666667

我有一个数据框,看起来像这样:

    ID    Date        Volume      Sales
0   1   2019-01-01  3.333333    1.333333
1   1   2019-02-01  3.333333    1.333333
2   1   2019-03-01  3.333333    1.333333
3   1   2019-04-01  2.666667    2.000000
4   1   2019-05-01  2.666667    2.000000
5   1   2019-06-01  2.666667    2.000000
6   2   2019-01-01  2.000000    2.666667
7   2   2019-02-01  2.000000    2.666667
8   2   2019-03-01  2.000000    2.666667
9   2   2019-04-01  1.333333    3.333333
10  2   2019-05-01  1.333333    3.333333
11  2   2019-06-01  1.333333    3.333333
我想总结每个组(ID)内一组日期的数据(数量和销售额)

2019-01-01至2019-04-01和2019-02-01至2019-05-01

我相信这可以通过for循环来实现,但是要想得到想要的结果还很困难

注:问题可能措辞不当。如果您有任何其他问题,请发表评论

例外输出:

ID         Date                 Volume      Sales
1   2019-01-01 to 2019-04-01    12.67        6
1   2019-02-01 to 2019-05-01    12           6.66
2   2019-01-01 to 2019-04-01    7.33         11.33
2   2019-02-01 to 2019-05-01    6.66         12
输出中不需要有日期列

df["group_1"] = (df["Date"] >= pd.Timestamp("2019-01-01")) & (
    df["Date"] <= pd.Timestamp("2019-04-01")
)
df["group_2"] = (df["Date"] >= pd.Timestamp("2019-02-01")) & (
    df["Date"] <= pd.Timestamp("2019-05-01")
)

g1 = df[df["group_1"] == True].groupby("ID")
g2 = df[df["group_2"] == True].groupby("ID")

df = pd.concat(
    [
        g1.agg({"Volume": "sum", "Sales": "sum"}),
        g2.agg({"Volume": "sum", "Sales": "sum"}),
    ]
).sort_index()

print(df)

如果需要
Date
列:

...

df = pd.concat(
    [
        g1.agg({"Volume": "sum", "Sales": "sum"}).assign(
            Date="2019-01-01 to 2019-04-01"
        ),
        g2.agg({"Volume": "sum", "Sales": "sum"}).assign(
            Date="2019-02-01 to 2019-05-01"
        ),
    ]
).sort_index()
印刷品:

批量销售日期
身份证件
1 12.666666 5.999999 2019-01-01至2019-04-01
112000000 6.666666 2019-02-01至2019-05-01
2 7.333333 11.333334 2019-01-01至2019-04-01
2019-02-01至2019-05-01的26.666666 12.000000

编辑:要概括:

df["Date"] = pd.to_datetime(df["Date"])

# add dates to this group:
groups = [
    [pd.Timestamp("2019-01-01"), pd.Timestamp("2019-04-01")],
    [pd.Timestamp("2019-02-01"), pd.Timestamp("2019-05-01")],
    [pd.Timestamp("2019-03-01"), pd.Timestamp("2019-06-01")],
]

grouped = []
for i, (t1, t2) in enumerate(groups, 1):
    df["group_{}".format(i)] = (df["Date"] >= t1) & (df["Date"] <= t2)
    grouped.append(
        df[df["group_{}".format(i)] == True]
        .groupby("ID")
        .agg({"Volume": "sum", "Sales": "sum"})
        .assign(Date="{} to {}".format(t1.date(), t2.date()))
    )

df = pd.concat(grouped).sort_index()

print(df)

您可以在
dts
列表中将日期范围设置为
(开始、结束)
元组:

dts = [('2019-01-01', '2019-04-01'), ('2019-02-01', '2019-05-01')]

df_out = pd.concat([
    (df
         .loc[df['Date'].between(dt_start, dt_end)]   # filter dates in range
         .groupby('ID', as_index=False).sum()         # calculate sum
         .assign(Date=f'{dt_start} to {dt_end}'))     # set `Dates` values
  for (dt_start, dt_end) in dts], ignore_index=True)[df.columns]

df_out
输出:

   ID                      Date     Volume      Sales
0   1  2019-01-01 to 2019-04-01  12.666666   5.999999
1   2  2019-01-01 to 2019-04-01   7.333333  11.333334
2   1  2019-02-01 to 2019-05-01  12.000000   6.666666
3   2  2019-02-01 to 2019-05-01   6.666666  12.000000

谢谢你的回复。是否有一种方法可以编写此代码,其中可以自动确定日期范围的数量。例如,如果我添加另一个日期范围。。我不必添加组_3。@tjjudge查看我的编辑。