我得到了这个时间数组,我需要从下一个值中减去前一个值。就像第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
我需要从第一个减去第二个,从第四个减去第三个,从第六个减去第五个,依此类推。然后在花药数组中一起得到结果并将它们加在一起。
答案 0 :(得分:1)
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.timedelta
的total_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')]
所以基本上它从第一个列表中获取一个项目,从第二个列表中获取一个项目并将其作为元组返回。