我有一些要分析的订单数据。
当前感兴趣的是:在哪个月份多久购买一次SKU?

这里有个小例子:

import datetime
import pandas as pd
import numpy as np

d = {'sku': ['RT-17']}
df_skus = pd.DataFrame(data=d)
print(df_skus)

d = {'date': ['2017/02/17', '2017/03/17', '2017/04/17', '2017/04/18', '2017/05/02'], 'item_sku': ['HT25', 'RT-17', 'HH30', 'RT-17', 'RT-19']}
df_orders = pd.DataFrame(data=d)
print(df_orders)

for i in df_orders.index:
    print("\n toll")
    df_orders.loc[i,'date']=pd.to_datetime(df_orders.loc[i, 'date'])

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

print(monthly_sales)


效果很好,但是如果我使用真实订单数据(来自CSV),则几分钟后会得到:


TypeError:仅对DatetimeIndex,TimedeltaIndex或PeriodIndex有效,但具有“ Int64Index”的实例


这个问题来自于线:


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


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

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"


然后我得到打印(monthly_sales)


空数据框
列:[txn_id,日期,item_sku,数量]
索引:[]


因此,我的数据中的某些内容可能会清空或阻止分组?
如何“清理”我的数据?
或者,我什至可以在这里和那里丢失销售数据,如果我可以“跳过”错误,这可能吗?

最佳答案

读取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

关于python - Pandas TypeError:仅对DatetimeIndex,TimedeltaIndex或PeriodIndex有效,但具有“Int64Index”的实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48272540/

10-10 03:36