我的数据格式为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
答案 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_timedelta
和mean
,然后执行
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。