以下是python中的列表,其中包含列车的时间列表,其中每个索引都作为列车的停止点
Train_arrival_time = ['Source', '09:30 PM', '09:56 PM', '11:23 PM', '12:01 AM', '12:12 AM', '12:44 AM', '01:55 AM', '03:18 AM', '04:58 AM', '06:18 AM', '06:33 AM', '07:23 AM', '08:45 AM', '09:14 AM', '10:17 AM', '10:59 AM', '12:15 PM', '01:30 PM', '01:49 PM', '02:55 PM', '03:16 PM', '03:58 PM', '05:15 PM', '05:38 PM', '06:45 PM', '07:20 PM', '08:07 PM', '08:38 PM', '09:25 PM', '11:28 PM', '12:50 AM', '01:21 AM', '01:53 AM', '02:45 AM', '02:57 AM', '03:45 AM', '05:20 AM', '06:00 AM', '06:30 AM']
从列表中可以看出,这列火车连续运行了三天(source
是起始站)。我试图获得两个站之间的时差,因为使用 12小时格式会产生混乱我尝试使用以下脚本将整个列表转换为 24小时格式
from datetime import *
t12 = '09:35 PM'
t24 = datetime.strptime(t12, '%I:%M %p')
正在给予
1900-01-01 21:35:00
作为输出。有没有办法避免获得UTC日期? 另外,我被困在如何在不同的日子里获得两个站之间的时差;即, 09:30 PM(第1天)和12:15 PM(第2天)
答案 0 :(得分:2)
我正在尝试获取两个电台之间的时差,因为使用12小时格式会产生混乱,我尝试使用以下脚本将整个列表转换为24小时格式
如果你需要的只是找到相邻物品的时差,那么这一天并不重要:
#!/usr/bin/env python
from datetime import datetime, timedelta
ZERO, DAY = timedelta(0), timedelta(days=1)
times = (datetime.strptime(time12h_string, '%I:%M %p')
for time12h_string in Train_arrival_time[1:])
previous_time = next(times)
time_in_transit = [ZERO]
for time24h in times:
time24h = datetime.combine(previous_time, time24h.time())
while time24h < previous_time: # time on the next station should not be ealier
time24h += DAY
time_in_transit.append(time24h - previous_time + time_in_transit[-1])
previous_time = time24h
此处time_in_transit
是从具有到达时间的第一个电台开始的电台之间的累积时间,即time_in_transit[i]
是i
的传输时间。站(站和第一站之间的时差)。它被计算为相邻站点之间时间差的一系列部分和(如itertools.accumulate()
),即:
Train_arrival_time
列表中的索引(与time_in_transit
列表相比移动一个)和/或到达时间来确定的 - 请查看电台 (time24h - previous_time)
是相邻电台之间的时差 - 请查看下方输出中的相邻列time_in_transit[-1]
是系列中的上一项(最后一项) - 它与Python中的time_in_transit[len(time_in_transit)-1]
相同有没有办法避免获得UTC日期?
datetime.strptime()
的结果是一个天真的日期时间对象,它与任何时区都不对应。如果你不知道具体的日期(年,月,日),没有必要谈论时区。
我被困在如何在不同的日子里得到两个站之间的时差;即,09:30 PM(第1天)和12:15 PM(第2天)
很容易找到相邻车站之间的时间和运输的总时间:
print("Station | Adjacent | Total")
print("\n".join(["{} | {:>8s} | {}".format(time12h, str(curr-prev), str(curr))
for time12h, curr, prev in zip(Train_arrival_time[1:],
time_in_transit,
[ZERO]+time_in_transit)]))
Station | Adjacent | Total
09:30 PM | 0:00:00 | 0:00:00
09:56 PM | 0:26:00 | 0:26:00
11:23 PM | 1:27:00 | 1:53:00
12:01 AM | 0:38:00 | 2:31:00
12:12 AM | 0:11:00 | 2:42:00
...
05:20 AM | 1:35:00 | 1 day, 7:50:00
06:00 AM | 0:40:00 | 1 day, 8:30:00
06:30 AM | 0:30:00 | 1 day, 9:00:00
查找i
- 和j
站之间的时差:
time_difference = time_in_transit[j] - time_in_transit[i]
答案 1 :(得分:1)
首先,将所有时间字符串转换为日期。这一天并不重要,但我们稍后会需要它。
from datetime import datetime, timedelta
times = [datetime.strptime(x, '%I:%M %p') for x in Train_arrival_time[1:]]
现在,您可以保留要添加的运行天数,并将其添加到列表中的所有日期时间。每当当前时间小于前一时间时,再添加一天。
days_to_add = 0
for i in range(1, len(times)):
times[i] += timedelta(days=days_to_add)
if times[i] < times[i-1]:
days_to_add += 1
times[i] += timedelta(days=1)
现在,您可以获得第一次和最后一次之间的调整时间和总时间差。要获得输出列表“第1天,时间x”,只需从输出中删除年份和月份。
for x in times:
print(x.strftime("Day %d, %H:%M"))
print(times[-1] - times[0])
输出:
Day 01, 21:30
...
Day 03, 06:30
1 day, 9:00:00
当然,如果连续两次的时间差大于一整天,那么你就不走运了。