Pandas TypeError:仅对DatetimeIndex,TimedeltaIndex或PeriodIndex有效,但得到'Int64Index'的实例

时间:2018-01-16 00:27:14

标签: python pandas validation

我有一些我想要分析的订单数据。 目前感兴趣的是:在哪个月购买SKU的频率是多少?

这是一个小例子:

try:
    monthly_sales = df_orders.groupby(["item_sku", pd.Grouper(key="date",freq="M")]).size()
    monthly_sales = monthly_sales.unstack(0) 
except:
    print "\n Here seems to be one issue"

工作正常,但如果我使用我的真实订单数据(来自CSV),我会在几分钟后得到:

  

TypeError:仅对DatetimeIndex,TimedeltaIndex或PeriodIndex有效,但得到'Int64Index'的实例

问题来自这条线:

  

monthly_sales = df_orders.groupby([“item_sku”,pd.Grouper(key =“date”,freq =“M”)])。size()

是否可以跳过错误? 我试了一下除了块:

{{1}}

然后我得到了print(monthly_sales)

  

清空数据框架   栏目:[txn_id,date,item_sku,quantity]
  指数:[]

因此,我的数据中的某些内容会清空或制动它的分组? 我怎样才能“清理”我的数据呢? 或者我甚至可以在这里和那里丢失销售数据,如果我可以“跳过”错误,这可能吗?

2 个答案:

答案 0 :(得分:1)

阅读CSV时,请使用parse_dates参数 -

df_order = pd.read_csv('file.csv', parse_dates=['date'])

自动将date转换为日期时间。如果这不起作用,那么您需要将其作为字符串加载,然后将errors='coerce'参数与pd.to_datetime -

一起使用
df_order['date'] = pd.to_datetime(df_order['date'], errors='coerce')

请注意,您可以将系列对象(以及其他内容)传递给pd.to_datetime`。

接下来,按照您的方式进行过滤和分组,它应该可以正常工作。

df_orders[df_orders["item_sku"].isin(df_skus["sku"])]\
     .groupby(['item_sku', pd.Grouper(key='date', freq='M')]).size()

item_sku  date      
RT-17     2017-03-31    1
          2017-04-30    1

答案 1 :(得分:0)

df_order = pd.read_csv('file.csv', parse_dates=['date'])

这对我有用,只需将 parse_dates=['date'] 添加到您的代码以及您尝试获取的任何日期格式列值作为输入,将其替换为“日期”。