加入两个时间轴/元组列表

时间:2013-06-20 09:05:02

标签: python

我有时间轴/时间序列,由两元组列表组成,其中元组的第一部分是时间戳,第二部分是值。元组按时间戳排序。

我现在有两个这样的时间表,需要将它们相互分开。这意味着如果我在两个时间轴中获得相同时间戳的值,我需要将它们分开。如果时间戳中的某个时间轴中没有值,则应假定为0。如果(且仅当)除以零,则应假设NaN。时间戳有很大的间隙,这意味着从min(timestamp)到max(timestamp)的迭代不是解决方案。

我构建的解决方案既非常非常规,又运行时间很短。由于时间表大约有一百万个条目,因此性能对我来说很重要。我的解决方案没有利用,两个列表都已排序。

是否有更好的解决方案,如果是的话?

#!/usr/bin/env python

l1 = [(1, 100), (2, 1000),           (4, 1500), (5, 5400),          (7, 7800)]
l2 = [(1, 20),  (2, 400),  (3, 240), (4, 500),  (5, 100),  (6, 27),          ]
ex = [(1, 5),   (2, 2),    (3, 0),   (4, 3),    (5, 54),   (6, 0),  (7, float('NaN'))]

def f(l1, l2):
  #Turn to dicts:
  l1d = dict(l1)
  l2d = dict(l2)

  #Compute Keyspace
  keys = set(l1d.keys()).union(set(l2d.keys()))

  result = []
  for key in keys:
    if not key in l2d:
      result.append((key, float('NaN')))
    elif key not in l1d:
      result.append((key, 0))
    else:
      result.append((key, l1d[key]/l2d[key])) 

  return result

r = f(l1, l2)

print("L1: %s" % (l1))
print("L2: %s" % (l2))
print("")
print("Expected: %s" % (ex))
print("Result: %s" % (r))

1 个答案:

答案 0 :(得分:3)

如果需要表现,请查看pandas

import pandas as pd

l1 = [(1, 100), (2, 1000),           (4, 1500), (5, 5400),          (7, 7800)]
l2 = [(1, 20),  (2, 400),  (3, 240), (4, 500),  (5, 100),  (6, 27),          ]

s1 = pd.Series(dict(l1))
s2 = pd.Series(dict(l2))

现在是一个非常明确的数学运算:

s1 / s2

返回

1     5.0
2     2.5
3     NaN
4     3.0
5    54.0
6     NaN
7     NaN

如果您希望将NaN替换为l2中存在的零:

s1.reindex(s1.index|s2.index).fillna(0) / s2


1     5.0
2     2.5
3     0.0
4     3.0
5    54.0
6     0.0
7     NaN

也适用于百万条目。您可以在索引中使用日期时间并在日期时间对它们进行操作。