Pandas重新采样应用自定义函数?

4

我正在尝试使用pandas将15分钟的时间段重新采样为1小时的时间段,但是要应用自定义函数。我的DataFrame格式如下:

Date                      val1       val2                  
2016-01-30 07:00:00       49.0       45.0
2016-01-30 07:15:00       49.0       44.0
2016-01-30 07:30:00       52.0       47.0
2016-01-30 07:45:00       60.0       46.0
2016-01-30 08:00:00       63.0       61.0
2016-01-30 08:15:00       61.0       60.0
2016-01-30 08:30:00       62.0       61.0
2016-01-30 08:45:00       63.0       61.0
2016-01-30 09:00:00       68.0       60.0
2016-01-30 09:15:00       71.0       70.0
2016-01-30 09:30:00       71.0       70.0

我想使用这个函数进行重新采样:

def log_add(array_like):
    return (10*math.log10((sum([10**(i/10) for i in array_like])))))

我明白;

df.resample('1H').apply(log_add)

但这样返回一个空的数据框,可以尝试这样做:
df.resample('1H').apply(lambda x: log_add(x))

同样的操作也是如此。有人知道为什么该函数没有正确应用吗?

非常感谢任何帮助。


我认为你想使用 df.resample('1H').agg(...)(不要引用我说的话)。重新采样对象现在基本上就像是一个 groupby。 - pbreach
1个回答

4

您可以添加参数on,在0.19.0版本的pandas中已经实现

print (df.resample('1H', on='Date').apply(log_add))

或者通过set_indexDate设置为index

df.set_index('Date', inplace=True)
print (df.resample('1H').apply(log_add))

首先检查列 Datedtype 是否为 datetime,如果不是,请使用 to_datetime

print (df.dtypes)
Date     object
val1    float64
val2    float64
dtype: object

df.Date = pd.to_datetime(df.Date)

print (df.dtypes)
Date    datetime64[ns]
val1           float64
val2           float64
dtype: object

1
谢谢回复,但不幸的是这并没有起作用;日期已经是索引,重新采样对于正常函数(例如'sum')有效,所以我认为我的自定义函数有问题,但不确定原因? - JayBe
@JasonB 有几个要点。使用 numpy 而不是 math,如果你正在使用 Python 2,你的函数将无法正常工作,因为整数除法的原因。请使用 from __future__ import division 重新运行你的代码。 - Ted Petrou
我使用pandas 0.19.1和Python 3进行测试,对我来说它完美地工作。问题也与样本有关吗? - jezrael
似乎不适用于.apply(func, args=(arg1,)) - Little Bobby Tables
.apply(lambda x: func(arg1,)) 这个怎么样? - jezrael
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接