【问题标题】:Pandas TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Int64Index'Pandas TypeError:仅对 DatetimeIndex、TimedeltaIndex 或 PeriodIndex 有效,但有一个“Int64Index”实例
【发布时间】:2018-01-16 00:27:14
【问题描述】:

我有一些要分析的订单数据。 目前感兴趣的是:在哪个月购买了哪个 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、数量]
索引:[]

所以我的数据中的某些内容会清空或破坏看起来像的分组? 如何“清理”我的数据?
或者,如果我可以“跳过”错误,我什至可以在这里和那里丢失销售数据,这可能吗?

【问题讨论】:

  • 能否请您指出是哪段代码引发了此错误?您对此样本数据有何期望?
  • 是的,抱歉 - 我添加了有问题的代码行,并且我已经尝试过 - 除了麻烦的行。
  • 您需要清理数据。显然,有时您的 df_orders.index 是 DatetimeIndex,有时是 Int64Index。您应该添加一个检查,如if df_orders.index.dtype != pd.DatetimeIndex....

标签: python pandas validation


【解决方案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

【讨论】:

    猜你喜欢
    • 2019-08-23
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多