python中上一个时间值与下一个时间值的减法

python中上一个时间值与下一个时间值的减法,python,datetime,data-extraction,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.142

我得到了这个时间数组,我需要从下一个值中减去上一个值。比如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
我需要从第一个减去第二个,从第四个减去第三个,从第六个减去第五个,依此类推。然后将结果聚集在另一个数组中,并将它们相加。

这是一种通过以下方式获得的结果:

要将其转换为秒,请执行以下操作:

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

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

从你的角度看,你的时间似乎是一个字符串列表

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'
]
使用
strtime
将它们转换为datetime对象。该函数将函数应用于iterable中的每个元素

times_converted = map(
    lambda x: datetime.datetime.strptime(x, '%Y-%m-%dT%H:%M:%S.%fZ'), 
    times
)
上面
strtime
的第二个参数是,它定义了转换应该如何进行

现在,您可以减去连续时间,并使用的
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]
我过去常常从列表中找出几对要减法的时间。符号
[::2]
表示从索引0开始,在列表中每隔一项进行一次。同样地,
[1::2]
意味着从索引1开始获取列表中的每一项。更多关于python的切片表示法

如果您不熟悉列表理解和
zip()
,也可以将上述代码编写为单个
for
循环:

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

zip()
函数接受两个iterables并返回成对的元组。例如,考虑下面的例子:

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

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

到目前为止你试过什么?你被卡在哪里了?你有什么可以分享的代码吗?这些是字符串还是datetime对象?它们是datetime对象。。。这是一个很长的问题,实际上,这只是最后一部分。这就是我到目前为止尝试过的,如果它们是datetime对象,那么你可以减去它们。你想要的输出是什么?可能是秒,但我想从第2行减去第1行,从第4行减去第3行,依此类推。我真的不知道这个panda模块在python 2.7上运行吗?我可以用导入的文本文件代替list>?@idrisbadmus,我已经用
dateutil
解决方案进行了更新。是的,您可以用python将导入的文本文件读取到列表中。哦,我刚刚检查了panda不在我的win 2.7版本中。不过谢谢,是的,我可以将文本导入列表,只是想知道熊猫是否可以。再次感谢
解析器。parse
strtime(…)
干净得多。
dateutil
现在是标准软件包了吗?@pault,还没有,但应该是,我会在我的帖子中添加一个链接。在我的最后一个答案中,我后来使用spilt函数提取了超时。非常感谢。请你推荐一个我能很好理解datetime的地方。我正在自学,除了python网站外,我没有找到其他网站。@idrisbadmus这里是
datetime
。在那一页上有很多很好的例子。祝你好运。@idrisbadmus这真的是你想要的吗?你说你想要第二个第一,第四个第三,等等,而不是第三个第二。而且,看起来他们真的是成双成对的。就像你每五秒钟做一次手术,每次大约需要0.3秒。哦,不,只是现在检查好了@pault,我需要它减去第二个第一,第四个第三。我以为它就是这么做的,但这减去了第二个第一,第三个第二,第四个第三。@idrisbadmus我按照您指定的方式更新了代码。唯一的变化是在
zip()
部分-我们得到了不同的成对切片进行减法。
# suppose you had two lists
X = ['A', 'B', 'C']
Y = ['X', 'Y', 'Z']
print(zip(X, Y))
#[('A', 'X'), ('B', 'Y'), ('C', 'Z')]