0

这是一个很难的:(我认为)

我有一个包含多列的时间序列索引数据框。我需要将数据重新采样为每分钟并使用列计算一些指标。问题是,我想为每分钟计算的值取决于该分钟内所有列中的值。我曾尝试使用resample('T').apply(func),但似乎func是分别应用于每一列,而不是接收其他列作为输入。相反,我希望每次调用都func接收一个包含该分钟时间索引的所有列的数据帧,然后我就可以使用该分钟的所有值,并基于所有这些值生成一个新值。

奖励:我实际上需要使用多个函数来执行此操作,因此生成的数据框有多个列,其名称与原始数据不同,其中每列中的每个值都是使用它所代表的一分钟内所有列中的值计算的。

当然有一种方法可以做到这一点,而无需用全能的熊猫遍历行......有什么想法吗?

示例:所需的输入和输出如下:(使用随机数据和函数,因为真正的代码是用于工作的,不能共享,所以 func1、func2 的内容无关紧要,只是它们对所有列的使用):

import pandas as pd

# functions to calculate (some random calculation using all columns)
def func1(df):
    return df.iloc[:,0].sum() + df.iloc[:,1].mean()

def func2(df):
    return (df.iloc[:,1] - df.iloc[:,2]).mean()

# Dataframe defined with datetime index with precision of 10s
ind = pd.date_range(start='09:00:00', end='09:03:00', freq='10S')
df1 = pd.DataFrame({1: range(len(ind)), 2: range(1, 1+len(ind)), 3:range(2, 2+len(ind))}, index=ind)
print(df1)

# New dataframe with DatetimeIndex at frequency of 1min
new_ind = pd.date_range(start='09:00:00', end='09:03:00', freq='T')
# Different column names to original:
df2 = pd.DataFrame(columns=[4,5], index=new_ind)
for m in range(len(new_ind)-1):
    minute_strt, minute_end = new_ind[m], new_ind[m+1]
    # The following chunk to be processed includes data from ALL 
    # columns of original dataframe within a one-minute span 
    df_to_process = df1.loc[minute_strt:minute_end, :]
    df2.iloc[m+1, :] = [func1(df_to_process), func2(df_to_process)]
print(df2)
4

0 回答 0