如何计算秒的平均值& Python中的毫秒数?

时间:2018-06-01 21:30:22

标签: python python-2.7 timedelta

我的数据格式为HH:MM:SS.milliseconds。如何在Python中计算此类数据的平均值?我需要以毫秒为单位的平均值。我查看了其他几个类似的帖子,但他们没有回答我的问题。

My data =  0:00:00.618000
           0:00:00.593000
           0:00:00.569000
           0:00:00.572000
           0:00:00.636000
           0:00:01
           0:00:01
           0:00:00.546000
           0:00:00.400000

5 个答案:

答案 0 :(得分:3)

我不知道您的数据大小,或者您是否需要内置解决方案。

但是,一个简单的解决方案是使用pandas。如果你有

mydata = ["0:00:00.618000",
          "0:00:00.593000",
          "0:00:00.569000",
          "0:00:00.572000",
          "0:00:00.636000",
          "0:00:01",
          "0:00:01",
          "0:00:00.546000",
          "0:00:00.400000"]

您可以使用pd.to_timedeltamean,然后执行

pd.Series(pd.to_timedelta(mydata)).mean()

可能/可能不会过度,但它真的可读性和直接性。

答案 1 :(得分:2)

第一步是将所有时间戳解析为可以执行算术运算的内容。这可以是timedelta个对象,也可以是整数微秒(或毫秒,因为你的时间都是0微秒),浮点秒或任何其他合理的类型。

例如,假设输入是一个大字符串:

ts = []
for h, m, s, u in re.findall(r'(\d+):(\d+):(\d+)(?:\.(\d+))?', bigstring):
    h, m, s = int(h), int(m), int(s)
    u = int(u) if u else 0
    ts.append(datetime.timedelta(hours=h, minutes=m, seconds=s, microseconds=u))

如果它是一个字符串列表或一个文件对象等,只需将其更改为迭代该字符串并对每个字符串执行re.search,而不是迭代re.findall

然后我们可以将它们的平均值与其他任何值相同:

sum(ts, datetime.timedelta()) / len(ts)

由于我使用了timedelta个值,结果将是:

datetime.timedelta(0, 0, 659333)

......或者,如果你print

0:00:00.659333

...或者,如果你想要它,比如说,几秒钟,只需调用它的total_seconds()方法:

0.659333

答案 2 :(得分:1)

我假设每个都是一个字符串,你可以在python 2和3中使用没有库来执行以下操作

def mean(numbers):
    return float(sum(numbers)) / max(len(numbers), 1)

def timestamp_to_millis(timestamp):
    hour, min, sec = map(float, timestamp.split(':'))
    mills = (((hour * 60 + min) * 60) + sec) * 1000
    return millis


my_data = # [ timestamps ... ]
my_mean = mean(map(timestamp_to_millis, my_data))

答案 3 :(得分:1)

看起来输入由字符串组成。那些应该转换为datetime.datetime个对象。使用datetime.datetime.strptime来执行此操作。

之后,任何事情的平均值都计算为sum(values) / len(values),但遗憾的是您无法汇总日期。你可以得到的是日期差异,所以你必须进行一些转换

例如:

dates = [datetime.datetime(1951, 1, 5),
         datetime.datetime(1951, 1, 7),
         datetime.datetime(1951, 1, 7)]

base_datetime = datetime.datetime.now()  # really, anything

relative_dates = [d-base_datetime for d in dates]

average_relative_datetime = sum(relative_dates, datetime.timedelta()) / len(relative_dates)

result = base_datetime + average_relative_datetime  # datetime.datetime(1951, 1, 6, 8, 0)

答案 4 :(得分:1)

以下是使用datetime.timedelta的一种方法。棘手的部分是将字符串转换为timedelta个对象。序列解包使这更容易和更有效地实现。

from datetime import timedelta

data = ['0:00:00.618000', '0:00:00.593000', '0:00:00.569000',
        '0:00:00.572000', '0:00:00.636000', '0:00:01',
        '0:00:01', '0:00:00.546000', '0:00:00.400000']

def converter(x):
    if '.' not in x:
        x += '.000000'
    hrs, mins, secs, millis = map(int, x[:-3].replace('.', ':').split(':'))
    return timedelta(hours=hrs, minutes=mins, seconds=secs, milliseconds=millis)

res = sum(map(converter, data), timedelta(0)) / len(data)

print(res)

0:00:00.659333

请注意,sum似乎仅适用于timedelta个参数,并附加timedelta(0)个参数,此技巧courtesy of @JochenRitzel