Python 沿数据帧列计算缺少行的平均值

Python 沿数据帧列计算缺少行的平均值,python,pandas,Python,Pandas,我有一个DataFrame对象,其中有几列如下: +--------+---------------------+-------+-------+-------+ | | Date | temp1 | temp2 | temp3 | +--------+---------------------+-------+-------+-------+ | 17687 | 2013-10-21 00:04:47 | 14.50 | 13.55 | 43.06

我有一个DataFrame对象,其中有几列如下:

+--------+---------------------+-------+-------+-------+
|        |        Date         | temp1 | temp2 | temp3 |
+--------+---------------------+-------+-------+-------+
|  17687 | 2013-10-21 00:04:47 | 14.50 | 13.55 | 43.06 |
|  48117 | 2013-10-21 00:18:07 | 14.64 | 13.42 | 37.48 |
|  76509 | 2013-10-21 00:33:51 | 14.32 | 13.55 | 27.26 |
| 102769 | 2013-10-21 00:48:24 | 14.38 | 13.30 | 37.10 |
| 133862 | 2013-10-21 01:04:36 | 14.77 | 13.11 | 28.25 |
| 162882 | 2013-10-21 01:18:14 | 14.50 | 13.98 | 39.71 |
| 191902 | 2013-10-21 01:34:11 | 14.39 | 13.08 | 28.69 |
| 220922 | 2013-10-21 01:48:38 | 14.31 | 13.00 | 43.56 |
| 249942 | 2013-10-21 02:04:26 | 14.10 | 13.94 | 39.79 |
| 278962 | 2013-10-21 02:18:13 | 14.01 | 13.55 | 23.46 |
| 307982 | 2013-10-21 02:34:04 | 14.00 | 13.21 | 44.94 |
| 337002 | 2013-10-21 02:48:27 | 14.81 | 13.38 | 29.44 |
+--------+---------------------+-------+-------+-------+
...
+--------+---------------------+-------+-------+-------+
|  15531 | 2013-10-22 00:05:20 | 14.84 | 13.07 | 30.25 |
|  44149 | 2013-10-22 00:18:11 | 14.35 | 13.22 | 51.02 |
| 102685 | 2013-10-22 00:49:34 | 14.46 | 13.98 | 24.17 |
| 127960 | 2013-10-22 01:04:02 | 14.07 | 13.49 | 30.74 |
| 186892 | 2013-10-22 01:34:14 | 14.75 | 13.01 | 45.77 |
| 214754 | 2013-10-22 01:48:17 | 14.35 | 13.03 | 40.75 |
| 240236 | 2013-10-22 02:02:39 | 14.31 | 13.28 | 34.88 |
| 507942 | 2013-10-21 02:34:04 | 14.87 | 13.62 | 50.16 |
| 111987 | 2013-10-21 02:48:27 | 14.74 | 13.63 | 51.36 |
+--------+---------------------+-------+-------+-------+
问题是在相同的时间间隔(例如15分钟)内找到一段时间(例如2天)内temp1、temp2和temp3的平均值。 有两个问题:(1)遗漏了一些行;(2) 温度的测量时间略有不同(整个数据集为+-3分钟,该特定示例为2分钟)

到目前为止,我的解决方案基于两个步骤。首先,找出一天中的最大间隔数(查看base中的所有天)。创建具有相应行数的新DataFrame对象。第二,检查数据集,若当前日期在3分钟内,则将值添加到对应的行中。 不幸的是,由于迭代的性质,它有点慢。我正试图找到一种更快的方法

有什么建议吗

谢谢

另外,看到这样的结果会很好(第一列是一些平均时间):


以下内容是否解决了您的任务

import datetime
from collections import defaultdict

def avg(lst):
    return sum(lst)/len(lst)
定义一些示例数据

def s2dt(s):
    fmt = '%Y-%m-%d %H:%M:%S'
    return datetime.datetime.strptime(s, fmt)

data = [(s2dt('2013-10-21 00:04:47'), 14.50, 13.55, 43.06),
        (s2dt('2013-10-21 00:18:07'), 14.64, 13.42, 37.48),
        (s2dt('2013-10-22 00:05:20'), 14.84, 13.07, 30.25),
        (s2dt('2013-10-22 00:18:11'), 14.35, 13.22, 51.02)]
定义一个按时段对时间进行分组的函数

def coarse(dt, granularity):
    residue = dt.minute % granularity
    if residue:
        residue = granularity-residue
    dt = dt + datetime.timedelta(minutes=residue, seconds=-dt.second,
                    microseconds=-dt.microsecond)
    t = dt.time()
    return t
按时间间隔分组数据

groupings = defaultdict(list)
for dt, t1, t2, t3 in data:
    groupings[coarse(dt, 15)].append([t1, t2, t3])
计算平均数

averages = dict((k, map(avg, zip(*v))) for k, v in groupings.iteritems())
得到

>>> for ct, values in sorted(averages.iteritems()):
...   print ct, ', '.join(map(lambda x: '%.2f' % x, values))
00:15:00 14.67, 13.31, 36.66
00:30:00 14.50, 13.32, 44.25

您能否为您的样本数据集提供所需的结果?尚不清楚+/-3分钟将进入何处。我认为,您的示例中没有一行的距离在3分钟之内。为了回答你的问题,我认为df.resample('3t',how='mean')会起作用。您可能需要澄清您的问题/示例。由于实验的性质,总共需要+/-3分钟。在我这里的示例中,最大差异略小于2分钟。无法帮助重新打开问题,但仍然无法确定结果逻辑:如果间隔为15分钟,那么为什么结果时间包含
5:00
18:00
34:00
,而不是
5:00
20:00
和'35:00'或
4:00
19:00
34:00
?对于那个例子,它只是平均值。在30天内,样本将接近您的时间(0:05、0:20、0:35、0:50、1:05、1:20、1:35、1:50、2:05、2:20、2:35和2:50)。非常感谢!有没有一种简单的方法来计算实际平均或中间时间,而不是严格的粒度?例如,00:04:45和00:05:25之间的平均值为00:05:05您可以将时间转换为秒,以与特征t1、t2、t3相同的方式评估结果的平均值;然后,如果需要,将其转换回时间对象。我不知道这些操作是否有标准函数,但这两种方法都不难。如果你在这条路上遇到麻烦,不要犹豫,打开新的问题。
>>> for ct, values in sorted(averages.iteritems()):
...   print ct, ', '.join(map(lambda x: '%.2f' % x, values))
00:15:00 14.67, 13.31, 36.66
00:30:00 14.50, 13.32, 44.25