

現時点から直近の出発時刻を求める方法探しています。  
現在時刻とタイムテーブルを4桁の数字に変換し，引き算をすれば良いと考えたのですが、以下の問題が生じております。  
どなたかよい方法をご教授いただければ幸いです。

↓時刻データの状態

[code]

    arrived_time = ['1216', '1337', '1018', '1809', '2058', '1919'...]
    time_table = ['1210', '1230', '1305', '1328', '1400', '1411'...]
    
[/code]

例えば1216から1210を引くと6分の差があることがわかるのですが，1216から1130を引いた場合86となってしまい計算不可能になります。


CC BY-SA 4.0
2021-01-04T16:35:58.207
73075
2021-01-06T00:36:49.693
2021-01-05T00:20:39.050
3060
41904
question
python
Python で時刻を表す文字列の引き算


時分を10進数で計算していることが問題です。  
単位を分にそろえてから減算すれば期待する結果が得られます。

[code]

    from datetime import datetime as dt
    t1 = dt.strptime('1216', '%H%M')
    t2 = dt.strptime('1130', '%H%M')
    d = (t1.hour*60+t1.minute) - (t2.hour*60+t2.minute)
    
[/code]


CC BY-SA 4.0
2021-01-05T00:30:42.077
73077
2021-01-05T00:30:42.077
35558
73075
answer


特定の駅の時刻表である`time_table`が用意されていて、ソートされていない時刻データの直近の値を取り出す場合は[ラムダ式を使う](https://stackoverflow.com/a/12141207)方法があります。

「直近」が文字通り「差分の最も少ない前後の時刻」ならば`datetime`の差分で求めた`timedelta`が最も小さいものを取ると良いでしょう。  
「直近」が「直前」「直後」ならば、結局何分差かを求める際に`timedelta`が必要ですが、比較自体は内包表記による文字列比較で対応可能です。

[code]

    from datetime import datetime
    
    arrived_time = ['1216', '1337', '1018', '1809', '2058', '1919', '1159']
    time_table = ['0000', '1140', '1210', '1230', '1305', '1328', '1400', '1411', '1900', '2359']
    
    for at in arrived_time:
        dat = datetime.strptime(at, '%H%M')
        immediate = min(time_table, key = lambda x:abs(datetime.strptime(x, '%H%M') - dat))  # 直近
        immediate = max([t for t in time_table if t <= at])  # 直前
        immediate = min([t for t in time_table if t > at])   # 直後
    
        diff = datetime.strptime(immediate, '%H%M') - dat
        minutes = abs(diff.total_seconds() / 60)
        print('"{}"の直近は"{}"で、{}分差です。'.format(at, immediate, int(minutes)))
    
[/code]


CC BY-SA 4.0
2021-01-05T00:42:55.933
73078
2021-01-05T00:42:55.933
9820
73075
answer


いろいろコメントしましたが、@payaneco さんが示したように乗り換え案内的な処理を考えているなら、まあ普通に考えられるケースということでしょうか。

時刻の差分計算はコメントに紹介したり、先に回答されているようにdatetimeモジュール(ライブラリ?)を使います。  
例えば @akira ejiri さんと @payaneco さんの処理の組み合わせで以下のように出来ます。

[code]

    diff = str(int((dt.strptime(出発時刻,"%H%M") - dt.strptime(現時点,"%H%M")).total_seconds() // 60))
    
[/code]

ただし提示された条件ならば、全部のデータを時刻に変換してから差分計算を行う必要は無くて、直近(直後)の出発時刻を見つけてから計算しても問題無いでしょう。  
時刻情報は4桁の数字なので単に文字列の上下としてソートできます。

[code]

    from datetime import datetime as dt
    
    arrived_time = ['1216', '1337', '1018', '1809', '2058', '1919']
    time_table = ['1210', '1230', '1305', '1328', '1400', '1411']
    
    #### それぞれの時刻にどちらの情報かの属性を付けて1つにまとめる
    t_arv = [[a,1] for a in arrived_time]
    t_dpt = [[d,2] for d in time_table]
    t_arv.extend(t_dpt)
    
    #### 時刻情報でソートする(4桁の数字なので単に文字列の上下としてソートできる)
    t_mix = sorted(t_arv, key=lambda x: x[0])
    t_mix_atr = [e[1] for e in t_mix]    #### 検索のために現/出発の属性だけのリスト化
    
    #### 現時点と直近の出発時刻のペアと差分を調べる処理
    list_result = []
    items = len(t_mix)
    for i in range(items):
        if t_mix[i][1] == 1:  #### 現時点情報なら処理を始める/出発時刻情報なら処理しない
            try:
                j = t_mix_atr[i:].index(2)    #### 以後の直近の出発時刻のインデックスを取得
                arv = t_mix[i][0]
                dpt = t_mix[i+j][0]
                #### 文字列を時刻に変換し、差分の値を分単位に計算して文字列化
                diff = str(int((dt.strptime(dpt,"%H%M") - dt.strptime(arv,"%H%M")).total_seconds() // 60))
                list_result.append([arv,dpt,diff])    #### 結果リストに追加
            except:
                pass
    
    for r in list_result:
        print(f'現時点：{r[0]},  出発時刻：{r[1]},  差分：{r[2]}分')
    
[/code]


CC BY-SA 4.0
2021-01-06T00:36:49.693
73110
2021-01-06T00:36:49.693
26370
73075
answer