从python中的下一个时间值减去前一个时间值

时间:2018-02-09 01:55:48

标签: python datetime data-extraction

我得到了这个时间数组,我需要从下一个值中减去前一个值。就像第1行第2行和第3行第4行一样。我现在已经和它斗争了好几天,现在的问题是我将如何进行减法。

以下是数据:

2017-12-21T14:49:17.518Z
2017-12-21T14:50:49.723Z
2017-12-21T14:50:54.028Z
2017-12-21T14:50:54.343Z
2017-12-21T14:50:59.084Z
2017-12-21T14:50:59.399Z
2017-12-21T14:51:04.142Z
2017-12-21T14:51:04.457Z
2017-12-21T14:51:09.204Z
2017-12-21T14:51:09.521Z
2017-12-21T14:51:14.261Z
2017-12-21T14:51:14.579Z
2017-12-21T14:51:19.326Z
2017-12-21T14:51:19.635Z
2017-12-21T14:51:24.376Z
2017-12-21T14:51:24.691Z
2017-12-21T14:51:29.435Z
2017-12-21T14:51:29.750Z
2017-12-21T14:51:34.498Z
2017-12-21T14:51:34.813Z

我需要从第一个减去第二个,从第四个减去第三个,从第六个减去第五个,依此类推。然后在花药数组中一起得到结果并将它们加在一起。

2 个答案:

答案 0 :(得分:1)

这是通过dateutil.parser.parse

的一种方式
from dateutil import parser

lst = ['2017-12-21T14:49:17.518Z',
       '2017-12-21T14:50:49.723Z',
       '2017-12-21T14:50:54.028Z',
       '2017-12-21T14:50:54.343Z',
       '2017-12-21T14:50:59.084Z',
       '2017-12-21T14:50:59.399Z']

lst = list(map(parser.parse, lst))
changes = [(j-i) for i, j in zip(lst, lst[1:])][::2]

将此转换为秒:

seconds = [i.total_seconds() for i in changes]

答案 1 :(得分:0)

以下是使用datetime库和strptime函数执行此操作的方法:

previous question开始,您的时间似乎是字符串列表。

times = [
    '2017-12-21T14:49:17.518Z',
    '2017-12-21T14:50:49.723Z',
    '2017-12-21T14:50:54.028Z',
    '2017-12-21T14:50:54.343Z',
    '2017-12-21T14:50:59.084Z',
    '2017-12-21T14:50:59.399Z',
    '2017-12-21T14:51:04.142Z',
    '2017-12-21T14:51:04.457Z',
    '2017-12-21T14:51:09.204Z',
    '2017-12-21T14:51:09.521Z',
    '2017-12-21T14:51:14.261Z',
    '2017-12-21T14:51:14.579Z',
    '2017-12-21T14:51:19.326Z',
    '2017-12-21T14:51:19.635Z',
    '2017-12-21T14:51:24.376Z',
    '2017-12-21T14:51:24.691Z',
    '2017-12-21T14:51:29.435Z',
    '2017-12-21T14:51:29.750Z',
    '2017-12-21T14:51:34.498Z',
    '2017-12-21T14:51:34.813Z'
]

使用strptime将它们转换为datetime对象。map()函数将函数应用于iterable中的每个元素。

times_converted = map(
    lambda x: datetime.datetime.strptime(x, '%Y-%m-%dT%H:%M:%S.%fZ'), 
    times
)

上面strptime的第二个参数是format string,它定义了转换应该如何发生。

现在您可以连续减去并使用datetime.timedeltatotal_seconds()方法来获得所需的差异:

diffs = [
    (b-a).total_seconds() for a, b in zip(times_converted[::2], times_converted[1::2])
]
#[92.205, 0.315, 0.315, 0.315, 0.317, 0.318, 0.309, 0.315, 0.315, 0.315]

我使用zip()从列表中获取成对的次数。符号[::2]表示从列表0开始,列出列表中的每个其他项。同样,[1::2]表示从索引1开始,列出列表中的每个其他项。更多关于python' s切片表示法here

如果您对列表推导和zip()不满意,上面的代码也可以写成单for个循环:

diffs = []
for i in range(0,len(times), 2):
    diffs.append((times_converted[i+1]-times_converted[i]).total_seconds())

更多关于zip()

zip()函数需要两次迭代并返回元组对。例如,请考虑以下示例:

# suppose you had two lists
X = ['A', 'B', 'C']
Y = ['X', 'Y', 'Z']
print(zip(X, Y))
#[('A', 'X'), ('B', 'Y'), ('C', 'Z')]

所以基本上它从第一个列表中获取一个项目,从第二个列表中获取一个项目并将其作为元组返回。