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查看我的编辑。