【问题标题】:Convert a 12 hour time format to 24 hour time format (keeping record of the day) in python在python中将12小时时间格式转换为24小时时间格式(保持当天的记录)
【发布时间】:2016-02-06 00:04:37
【问题描述】:

以下是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:30PM(第 1 天)和 12:15PM(第 2 天)

【问题讨论】:

  • datetime 对象包含一个日期——即datetime 中的date。此外,如果您想跟踪不同的日子,为什么要排除它们?
  • 您只想显示那些对象的时间吗?如果是这样,您需要使用strftime 来格式化您想要的字符串。但是,如果要对它们进行计算,则应将它们保留为 datetime 对象。
  • @TigerhawkT3 但日期是 UTC 的开始日期。我怎样才能得到它当前的 UTC 日期,或者更好的本地时间(IST)
  • 我建议你谷歌如何创建datetime对象。
  • arrival_time = t24.time() 。你为什么认为,你得到 UTC 日期?您不提供任何时区信息,因此 datetime 对象不包含 tzinfo

标签: python list datetime time


【解决方案1】:

我正在尝试获取两个站点之间的时差,由于使用 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 列表相比移动了一个)和/或它们的到达时间——查看输出中的Station列下面
  • (time24h - previous_time) 是相邻站点之间的时间差 -- 查看下面输出中的 Adjacent
  • time_in_transit[-1] 是该系列的上一篇(最后一篇) -- 与 Python 中的 time_in_transit[len(time_in_transit)-1] 相同
  • 当前项是总和“当前差值 + 累计总和”——查看下面输出中的 Total 列。

有什么方法可以避免获取 UTC 日期?

datetime.strptime() 的结果是一个不对应任何时区的简单日期时间对象。如果您不知道具体的日期(年、月、日),就没有必要谈论时区。

我被困在如何获得不同日期的两个站点之间的时差;即,晚上 9:30(第 1 天)和中午 12:15(第 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-th 和j-th 站之间的时差:

time_difference = time_in_transit[j] - time_in_transit[i]

【讨论】:

  • 感谢您的回答,但我想我又被卡住了。 time difference 不起作用并在传输差异足够大时给出IndexError: list index out of range 错误。比如说,time_in_transit[40] - time_in_transit[2] 我得到了1 day, 4:22:00 作为time_in_transit[35] - time_in_transit[2] 的答案,而实际花费的时间超过 3 天。 :|
  • @Jarwin: 1. IndexError 问题很简单(你只需要了解 Python 中的索引是如何工作的——Stack Overflow 上有很多现有的问题。我建议使用一个小列表( Python 交互式 shell 中的两个/三个项目,例如L=[10,20,30]):给它各种索引(正、负、大、小、零、整数、浮点数、字符串),看看会发生什么,什么输入会导致什么错误) 2. total 相差只有 33 小时,问题中的输入远少于三天(注意:一天 == 24 小时)。
  • 谢谢先生,我知道了。如果问的不是太多,请您告诉我您在time_in_transit 列表中所做的事情吗?或者提供参考?
【解决方案2】:

首先,将所有时间字符串转换为日期。日子并不重要,但我们稍后会需要它。

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

当然,如果连续两次的时间差大于一整天,那你就倒霉了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2013-07-14
    • 2019-12-24
    • 2015-01-24
    相关资源
    最近更新 更多