【问题标题】:Adding specific days in python table在 python 表中添加特定日期
【发布时间】:2018-05-31 05:30:11
【问题描述】:

我有一个数据集 (Product_ID,date_time, Sold),其中包含在不同日期销售的产品。日期不一致,给出 9 个月,从一个月开始随机 13 天或更长时间。我必须以这样一种方式分离数据,即每种产品在 1-3 天、4-7 天、8-15 天和 >16 天销售了多少产品。 .那么如何使用 pandas 和其他包在 python 中编写代码

PRODUCT_ID DATE_LOCATION Sold 0E4234 01-08-16 0:00 2 0E4234 02-08-16 0:00 7 0E4234 04-08-16 0:00 3 0E4234 08-08-16 0:00 1 0E4234 09-08-16 0:00 2 . . (same product for 9 months sold data) . 0G2342 02-08-16 0:00 1 0G2342 03-08-16 0:00 2 0G2342 06-08-16 0:00 1 0G2342 09-08-16 0:00 1 0G2342 11-08-16 0:00 3 0G2342 15-08-16 0:00 3 . . .(goes for 64 products each with 9 months of data) .

我什至不知道如何在 python 中为此编写代码 需要的输出是

PRODUCT_ID      Days   Sold
0E4234          1-3      9
                4-7      3
                8-15     16
                 >16     (remaing values sum)
0G2342          1-3      3
                4-7      1
                8-15     7
                 >16    (remaing values sum)
.
.(for 64 products)
.

如果至少有人发布了从哪里开始的链接会很高兴

【问题讨论】:

  • 那是需要编写的整个程序,SO不是代码编写服务。你应该学习一些 python/pandas 教程,测试一些东西,并在这里提出你遇到具体问题的问题
  • 日期不一致怎么办?您显示的行似乎都具有相同的格式...

标签: python python-3.x pandas numpy pivot-table


【解决方案1】:

您可以先将日期转换为 dtetimes 并通过dt.day 获取天数:

df['DATE_LOCATION'] = pd.to_datetime(df['DATE_LOCATION'], dayfirst=True)
days = df['DATE_LOCATION'].dt.day

然后通过cut进行分箱:

rng = pd.cut(days, bins=[0,3,7,15,31], labels=['1-3', '4-7','8-15', '>=16'])
print (rng)
0      1-3
1      1-3
2      4-7
3     8-15
4     8-15
5      1-3
6      1-3
7      4-7
8     8-15
9     8-15
10    8-15
Name: DATE_LOCATION, dtype: category
Categories (4, object): [1-3 < 4-7 < 8-15 < >=16]

并按产品聚合sum 并分箱Series

df = df.groupby(["PRODUCT_ID",rng])['Sold'].sum()
print (df)
PRODUCT_ID  DATE_LOCATION
0E4234      1-3              9
            4-7              3
            8-15             3
0G2342      1-3              3
            4-7              1
            8-15             7
Name: Sold, dtype: int64

如果需要也按years 计算:

df = df.groupby([df['DATE_LOCATION'].dt.year.rename('YEAR'), "PRODUCT_ID",rng])['Sold'].sum()
print (df)

YEAR  PRODUCT_ID  DATE_LOCATION
2016  0E4234      1-3              9
                  4-7              3
                  8-15             3
      0G2342      1-3              3
                  4-7              1
                  8-15             7
Name: Sold, dtype: int64

【讨论】:

  • 我得到了不同的输出,从 2016 年 8 月开始到 2017 年 5 月结束的日期是否会影响它,因为它涉及 2 年?
  • @san - 你能解释更多吗?我只使用您问题中的数据,真实数据得到不同的输出。
  • 如果还需要每年获得输出,请在输出中添加经过测试的解决方案。
  • 有没有办法在1-3天以上再增加一个细分“平均值”?
  • @san - 你认为所有的组?然后把['Sold'].sum()改成['Sold'].agg(['sum','mean'])
【解决方案2】:

假设您的数据框名为 df。

df["DATE_LOCATION"] = pd.to_datetime(df.DATE_LOCATION)
df["DAY"] = df.DATE_LOCATION.dt.day

def flag(x):
    if 1<=x<=3:
        return '1-3'
    elif 4<=x<=7:
        return '4-7'
    elif 8<=x<=15:
        return '8-15'
    else:
        return '>16' # maybe you mean '>=16'.

df["Days"] = df.DAY.apply(flag)

df.groupby(["PRODUCT_ID","Days"]).Sold.sum()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多