【问题标题】:unable to perform time based rolling operations window pandas? Always gives window must be an integer无法执行基于时间的滚动操作窗口熊猫?总是给出窗口必须是整数
【发布时间】:2020-02-18 20:12:09
【问题描述】:

我的数据是这样的

{'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'] 作为索引。仍然,不起作用。

它总是给出错误窗口必须是一个整数。

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)

我在这里错过了什么?

谢谢

【问题讨论】:

  • 我认为问题在于df.rolling() 的规范,因为它将“2min”解释为字符串。你试过ro = df.rolling('2m', on='time').count()吗?
  • 是的。已经试过了。 2m 2s 等不起作用

标签: python pandas rolling-computation


【解决方案1】:

我认为您可以先创建字典列表并传递给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()

【讨论】:

  • df = pd.DataFrame(out) 如果给出标量值,这将给出需要索引的错误。而且我不能使用json.loads(line)["transaction"] for line in sys.stdin,因为来自流的json不一定相同。有些根本没有'transaction'。但我会尝试转换时间列
  • @gamer - 是的,我认为这是关键 - 转换为日期时间
  • 我也有这个想法。但我试过这个例子给出了同样的错误,即窗口必须是一个整数
  • 我认为索引需要采用转换后的 DateTime 格式。然后它可能会起作用,但我不知道该怎么做。
  • 我无法收集列表中的所有数据,然后将其作为流式应用程序进行计算。但我明白了。只需要更改时间格式。并申请 to_datetime。它有效。谢谢!
猜你喜欢
  • 2018-11-07
  • 2017-03-30
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 2020-04-21
  • 2021-03-30
  • 1970-01-01
相关资源
最近更新 更多