【问题标题】:How to get the mean over time value如何获得随时间变化的平均值
【发布时间】:2013-10-23 15:00:00
【问题描述】:

我有一个每秒包含多个数据行的 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

非常感谢!

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 欢迎来到 SO,在提问之前需要展示你的努力。
  • ...或者等待片刻热情回复。
  • @beroe,我忍不住要锻炼我的 pandas-fu ;),否则 @/Diego 是对的。
  • 不,这不是我的作业:)。我一直在寻找一些想法,因为我对 python 不太熟悉,并且在网上搜索并没有带来任何有用的东西来解决我的问题。以前从没听说过pandas,所以很庆幸现在有了一个新的起点。

标签: python mean


【解决方案1】:

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'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2023-03-17
    • 2022-01-21
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多