Pandas.DataFrame.resample的意外结果

时间:2017-04-10 09:46:41

标签: python pandas dataframe group-by

我的数据集结构如下图所示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月。有人可以指导我代码中可能存在的问题吗?感谢

2 个答案:

答案 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)