0

我有一个每秒包含多个数据行的 csv 文件,我需要获取每秒的平均数据值。输入数据(> 2000 行)如下所示:

11:24:13,1.518
11:24:13,1.576
11:24:13,1.529
11:24:14,1.529
11:24:14,1.576
11:24:14,1.565
11:24:14,1.553
11:24:15,1.506
11:24:15,1.482
11:24:15,1.541
11:24:15,1.576
11:24:15,1.506
...
12:00:20,1,508

输出应如下所示:

11:24:13,1.541
11:24:14,1.555
11:24:15,1.522
...
12:00:20,1,508

下面的答案已经非常有帮助了,但是尝试使用 pandas 获得数千个时间值的平均值,我只得到第一和最后 15 个输出行:

time
2013-10-30 11:24:12    1.5341
2013-10-30 11:24:13    1.5658
2013-10-30 11:24:14    1.5480
2013-10-30 11:24:15    1.5517
2013-10-30 11:24:16    1.5411
2013-10-30 11:24:17    1.5247
2013-10-30 11:24:18    1.5248
2013-10-30 11:24:19    1.5082
2013-10-30 11:24:20    1.4588
2013-10-30 11:24:21    1.6187
2013-10-30 11:24:22    1.5470
2013-10-30 11:24:23    1.5211
2013-10-30 11:24:24    1.5812
2013-10-30 11:24:25    1.5457
2013-10-30 11:24:26    1.5411  
...
2013-10-30 12:00:36    1.631900
2013-10-30 12:00:37    1.671900
2013-10-30 12:00:38    1.596400
2013-10-30 12:00:39    1.616500
2013-10-30 12:00:40    1.691700
2013-10-30 12:00:41    1.720000
2013-10-30 12:00:42    1.660100
2013-10-30 12:00:43    1.530700
2013-10-30 12:00:44    1.621200
2013-10-30 12:00:45    1.643600
2013-10-30 12:00:46    1.591600
2013-10-30 12:00:47    1.562300
2013-10-30 12:00:48    1.612900
2013-10-30 12:00:49    1.589500
2013-10-30 12:00:50    1.560667
Name: value, Length: 2199, dtype: float64

所以我又被卡住了,不知道如何才能只获得 2199 行中每一行的平均值的时间值?所以它看起来像这样:

11:24:13,1.541
11:24:14,1.555
11:24:15,1.522
...
12:00:20,1,508

非常感谢!

4

1 回答 1

4

Pandas就是为此而生的。请注意,我正在DataFrame从包含您发布的数据的字符串中构建。大多数时候,您可能会使用 CSV 文件,而 pandas 可以通过read_csv.

d = """
11:24:13,1.518
11:24:13,1.576
11:24:13,1.529
11:24:14,1.529
11:24:14,1.576
11:24:14,1.565
11:24:14,1.553
11:24:15,1.506
11:24:15,1.482
11:24:15,1.541
11:24:15,1.576
11:24:15,1.506
"""

import pandas as pd

# get the data in shape
csvish = map(lambda row: row.split(','), filter(lambda s: s, d.split('\n')))

df = pd.DataFrame(csvish, columns=('time', 'value'))

# convert to sensible types (read_csv can do this implicitly)
df.time = pd.to_datetime(df.time)
df.value = df.value.astype(float)

df.groupby('time').value.mean()

输出如下内容:

# outputs:

# time
# 2013-10-23 11:24:13    1.54100
# 2013-10-23 11:24:14    1.55575
# 2013-10-23 11:24:15    1.52220

脚注:

read_csv用于解析日期可以通过以下方式完成parse_dates

df = pd.read_csv(StringIO.StringIO(d[1:]), header=None, parse_dates=[0])

DataFrame可以通过以下方式使用构造函数np.array

df = pd.DataFrame(np.array([(datetime.datetime.strptime(row[0], "%H:%M:%S"), 
                  row[1]) for row in csvish]), columns=('time', 'value'))
于 2013-10-23T15:18:30.883 回答