在python中将12小时时间格式转换为24小时时间格式(保留当天的记录)

时间:2015-11-05 08:28:41

标签: python list datetime time

以下是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天)

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]相同
  • 当前项目是总和&#34;当前差额+累计金额&#34; - 查看下面输出中的总计列。
  

有没有办法避免获得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

当然,如果连续两次的时间差大于一整天,那么你就不走运了。