Pandas:基于时间的数据帧字典分块

Pandas: chunking of a dictionary of dataframes based on time

我有一个数据框字典,其中每个数据框都有价格和时间戳列。像这样 {'A':df1, 'B':df2}

我需要构建一个函数,它可以将 dict 中的数据帧切成 H 小时的时间戳块,然后将这个数据帧的 dict 传递给每个块的另一个函数(它进行一些计算)。

我该如何推进?

例如

def foo(dict_of_dataframes):
    for id, df in dict_of_dataframes.items():
        do_something()

def boo(dict_of_dataframes, chunksize):
    """
    Needs to chunk up the @dict_of_dataframes in @chunksize hours
    and needs to call foo function on these chunks of
    @dicts_of_dataframes
    """

示例数据:

df1:
Time                       Price
2017-03-07 09:47:31+00:00  100
2017-03-07 11:27:31+00:00  120
2017-03-07 14:47:31+00:00  150
2017-03-07 17:17:31+00:00  135
2017-03-07 20:57:31+00:00  200
2017-03-08 03:27:31+00:00  120
2017-03-08 09:57:31+00:00  100
2017-03-08 11:27:31+00:00  150

df2:
Time                       Price
2017-03-07 09:07:31+00:00  200
2017-03-07 10:27:31+00:00  300
2017-03-07 12:47:31+00:00  100
2017-03-07 17:47:31+00:00  250
2017-03-07 22:27:31+00:00  300
2017-03-08 01:57:31+00:00  500
2017-03-08 02:57:31+00:00  500
2017-03-08 10:27:31+00:00  100

我需要有关 boo 函数的帮助。如何推进这一进程?

这些模拟其他函数调用的 boo 函数也有特定的术语。我已经看过几次了,如果您能指出一个解释如何设计这些 'function caller' 函数的资源,我将不胜感激。

我认为您真正想要的可以使用 resample 实现 - 基本上是日期时间的 groupby。假设你需要6小时内的交易金额,你可以使用这个:

def boo(dict_dfs, hours):
    return {k: v.resample(f'{hours}H').sum() for k,v in dict_dfs.items()}

现在,如果你 100% 确定你需要听写,请使用 groupby:

def boo(dict_dfs, hours):
    return {k:{hr:v for hr, v in df.groupby(Grouper(key='Time', freq=f'{hours}H'))} for k, df in dict_dfs.items()}

顺便说一句,如果你想在字典上循环 {key, value},使用 dict.items(),而不是字典本身。

还有一点要注意:我多次看到人们过度复杂化他们的数据结构。大多数时候你不需要数据帧的字典——你可以使用一个数据帧,只有一个 category 列或者甚至是一个多索引(比如, [category, Time] 在你的情况下是多索引。随着这样,您将获得更多可重用、快速和干净的代码!