我的数据集结构如下图所示2017年1月。
Date ProductID ProductType Qty
1.1.2017 1000 101 7
1.1.2017 1001 111 2
1.1.2017 1000 101 1
1.1.2017 1004 107 12
2.1.2017 1000 101 6
2.1.2017 1001 111 5
2.1.2017 1001 111 4
…..
31.1.2017 1000 101 7
31.1.2017 1001 111 5
31.1.2017 1001 111 7
我想计算产品类型为101和111的每个产品ID的每周销售额,以便我的结果如下所示
ProductID| WeeklyDates| Sales
1000 | 1.1.2017 | 14
| 1.8.2017 | NaN
| 1.15.2017 | NaN
| 1.22.2017 | NaN
| 1.29.2017 | 7
-----------------------------------
1001 | 1.1.2017 | 11
| 1.8.2017 | NaN
| 1.15.2017 | NaN
| 1.22.2017 | NaN
| 1.29.2017 | 12
这里NaN表示我在示例中没有这些日期的数据。现在,为了获得这些结果,我使用以下代码
import pandas as pd
df = pd.read_csv('data.csv', encoding = 'latin-1', sep=',')
df['Date'] = pd.to_datetime(df['Date'])
transaction_types = [101, 111]
s_df = df[df['ProductType'].isin(transaction_types)]
res_df = s_df.filter(['Date','ProductID','Qty']) # filter it because I do not want other product type column now
res_df = res_df.set_index('Date').groupby('ProductID').resample('W').sum()
res_df.to_csv('result.csv', sep=';', encoding='latin-1')
它给我带来了一些奇怪的结果。我得到了一些我在数据中甚至没有的日期。我只显示一个ID的结果
ProductID| Date |ProductID| Qty
1000 | 01/01/2017 | 4000 | 41
1000 | 08/01/2017 | |
1000 | 15/01/2017 | 33000 | 54
1000 | 22/01/2017 | 87000 | 313
1000 | 29/01/2017 | 79000 | 94
1000 | 05/02/2017 | 36000 | 413
1000 | 12/02/2017 | |
1000 | 19/02/2017 | |
1000 | 26/02/2017 | |
1000 | 05/03/2017 | 8000 | 78
结果是原创的,与上述示例不符。但是产品ID来了2次,我认为它也是产品ID的总和。总和也不正确。日期也一直持续到3月,在我的数据集中,我的日期只有1月。有人可以指导我代码中可能存在的问题吗?感谢
答案 0 :(得分:1)
我没有给出任何日期格式。例如
df['Date'] = pd.to_datetime(df['Date']) # Not correct
df['Date'] = pd.to_datetime(df['Date'], format='%d.%m.%Y') # Correct way
所以正因为如此,它将几个月视为天,反之亦然,这就是我得错结果的原因。
答案 1 :(得分:1)
我陷入了同样的问题,并遇到了这个答案。浏览完熊猫文档后,我了解到一种更灵活的解决方法,就是允许熊猫推断出“ datetime”格式,如下所示:
df['Date'] = pd.to_datetime(df['Date'], infer_datetime_format=True)