无法执行基于时间的滚动操作 window pandas?总是给出 window 必须是整数

unable to perform time based rolling operations window pandas? Always gives window must be an integer

我的数据的形式是

{'transaction': {'merchant': 'merchantA', 'amount': 20, 'time': '2019-02-13T10:00:00.000Z'}}
{'transaction': {'merchant': 'merchantA', 'amount': 90, 'time': '2019-02-13T11:00:00.000Z'}}
.
.
.

并且我想根据时间执行一些滚动操作。例如,过去 'X' 分钟内发生的交易数量等

我尝试了多种方法,但无法弄清楚。 最初,我给 len(df.index) 作为索引。 (不知道那样做有没有效率)

后来我也试过给data['transaction']['time']做索引。仍然,不起作用。

总是报错window must be an integer。

df = pd.DataFrame()
    df2 = pd.DataFrame()
    for line in sys.stdin:
        data = json.loads(line)
        # df1 = pd.DataFrame(data["transaction"], index=[len(df.index)])
        df1 = pd.DataFrame(data["transaction"], index=[data['transaction']['time']])
        # df1 = pd.DataFrame.from_dict(data, orient='index')
        df = df.append(df1)
        ro = df.rolling('2min', on='time').count()
        # ro = pd.get_dummies(df).rolling('2M').count()
        print(ro)
        # df2 = df.merge(ro)

    # print(df2)
    print(df)

我在这里错过了什么?

谢谢

我认为您可以先创建字典列表并传递给 DataFrame 构造函数,将列 time 转换为日期时间,然后使用 rolling:

out = [json.loads(line)["transaction"] for line in sys.stdin]
df = pd.DataFrame(out)
df['time'] = pd.to_datetime(df['time'])

然后:

df['new'] = df.rolling('2min', on='time')['amount'].count()
print (df)
    merchant  amount                      time  new
0  merchantA      90 2019-02-13 11:00:00+00:00  1.0
1  merchantA      90 2019-02-13 11:00:00+00:00  2.0

编辑:

您的解决方案应该更改:

out = []
for line in sys.stdin:
    data = json.loads(line)
    out.append(data["transaction"])

df = pd.DataFrame(out)
df['time'] = pd.to_datetime(df['time'])

df['new'] = df.rolling('2min', on='time')['amount'].count()