5

次のような文字列のリストがあります。

4:00-5:00PM
11:00-2:00PM
12:00-1:00PM
11:00-1:00AM

そして、2 つの時間オブジェクトを作成する効果的な方法を見つけようとしています (これが時間の範囲を追跡する唯一の方法だと思います。これは後で日付オブジェクトと結合します)。11:00-1:00AM と言う意味は人間には明らかですが、これを次のように変換する効果的な方法は何か疑問に思っています。

datetime.time(23, 0)
datetime.time(1, 0)

私の現在のアプローチは、最初の時間を取り、PM と AM のバージョンを作成し、(指定されている) 終了時間で timedelta を取り、2 つの違いのうち短い方を正しいものにすることです。

4

2 に答える 2

3

これは簡単な実装です。

    >>> def timeRange(timestr):
    ...     t1, t2 = timestr.split("-")
    ...     timeFormat = "%I:%M%p"
    ...     t1AM = datetime.datetime.strptime(t1 + "AM", timeFormat)
    ...     t1PM = datetime.datetime.strptime(t1 + "PM", timeFormat)
    ...     t2 = datetime.datetime.strptime(t2, timeFormat)
    ...       
    ...     if (t2 - t1AM).seconds < (t2-t1PM).seconds:
    ...         return t1AM.time(), t2.time()
    ...     else:
    ...         return t1PM.time(), t2.time()
    >>> timeRange("11:00-2:00PM")
    (datetime.time(11, 0), datetime.time(14, 0))
    >>> timeRange("4:00-5:00PM")
    (datetime.time(16, 0), datetime.time(17, 0))
    >>> timeRange("11:00-1:00AM")
    (datetime.time(23, 0), datetime.time(1, 0))
    >>> timeRange("11:00-2:00PM")
    (datetime.time(11, 0), datetime.time(14, 0))
    >>> timeRange("12:00-1:00PM")
    (datetime.time(12, 0), datetime.time(13, 0))

これはオブジェクトを返しますが、time必要に応じてそれを datetime オブジェクトにまとめることができます。

于 2012-07-12T07:38:00.297 に答える
2

あなたの質問には暗黙のうちに2つの仮定があります:

  • これらの時間の間の可能な限り短い期間を探しています
  • 1 回目は 2 つのうち早い方です。

これらの仮定が正しい場合、簡単な最適化は次のようになります。

  • 最初の時間が秒より大きい場合 (例: 11:00-1:00AM または 11:00-1:00PM)、早い方の時間が秒の「反対」の AM/PM インジケータになります。それ以外の場合、初回の AM/PM は同じです。

これは、たとえば 6:00-6:00AM (6:00PM-6:00AM は 6:00AM-6:00AM よりも短い) など、最も長い時間でも機能します。

2 番目の観察は、単純な時間オブジェクトを使用できないことです。

  • AM->PM の期間は、1 日の境界 (真夜中) を超えて発生します。これはおそらく、この状態で timedelta の計算を台無しにしています。

したがって、datetime を使用するか、最初のオブジェクトの時刻が前日であることを示す構造にこれらすべてをラップする必要があると思います。

お役に立てれば :)

于 2012-07-12T07:35:28.970 に答える