Python 将 GTFS 时间转换为日期时间

Python convert GTFS time to datetime

由于时间表周期的原因,GTFS时间超过23:59:59是很常见的。即最后一个时间可能是25:20:00(第二天01:20:00),所以当你将时间转换为datetime时,遇到这些时间就会报错。

有没有办法将 GTFS 时间值转换为标准日期时间格式,而无需将小时拆分出来,然后再转换回正确格式的字符串,然后将其转换为日期时间。

t = ['24:22:00', '24:30:00', '25:40:00', '26:27:00']
'0'+str(pd.to_numeric(t[0].split(':')[0])%24)+':'+':'.join(t[0].split(':')[1:])

对于上面的例子,我希望只看到

['00:22:00', '00:30:00', '01:40:00', '02:27:00']

我没有找到简单的方法,所以我只是写了一个函数来做。

如果其他人想要解决方案,这是我的:

from datetime import timedelta
import pandas as pd

def list_to_real_datetime(time_list, date_exists=False):
    '''
    Convert a list of GTFS times to real datetime list

    :param time_list: GTFS times
    :param date_exists: Flag indicating if the date exists in the list elements
    :return: An adjusted list of time to conform with real date times
    '''

    # new list of times to be returned
    new_time = []

    for time in time_list:

        plus_day = False
        hour = int(time[0:2])

        if hour >= 24:
            hour -= 24
            plus_day = True

        # reset the time to a real format
        time = '{:02d}'.format(hour)+time[2:]

        # Convert the time to a datetime
        if not date_exists:
            time = pd.to_datetime('1970-01-01 '+time, format='%Y-%m-%d')

        if plus_day:
            time = time + timedelta(days=1)

        new_time.append(time)

    return new_time
from datetime import datetime, timedelta

def gtfs_time_to_datetime(gtfs_date, gtfs_time):
    hours, minutes, seconds = tuple(
        int(token) for token in gtfs_time.split(":")
    )
    return (
        datetime.strptime(gtfs_date, "%Y%m%d") + timedelta(
           hours=hours, minutes=minutes, seconds=seconds
        )
    )

给出以下结果

>>> gtfs_time_to_datetime("20191031", "24:22:00")
datetime.datetime(2019, 11, 1, 0, 22)
>>> gtfs_time_to_datetime("20191031", "24:22:00").time().isoformat()
'00:22:00'

>>> t = ['24:22:00', '24:30:00', '25:40:00', '26:27:00']
>>> [ gtfs_time_to_datetime("20191031", tt).time().isoformat() for tt in t]
['00:22:00', '00:30:00', '01:40:00', '02:27:00']