2016-08-09 61 views
0

私は同じように、二つの日付を持っています:私は何をしたいことは、これら二つの日付の間にある5分間隔でタイムスタンプのリストを取得しているpython datetime-spanを等間隔の時間間隔に分割する方法は?

date_a = datetime.datetime(2016, 8, 9, 8, 24, 30, 993352) 
date_b = datetime.datetime(2016, 8, 9, 7, 24, 30, 993352) 

。上記の二つの日付の結果は次のようになります。

five_min_timestamps = [ 
    datetime.datetime(2016, 8, 9, 7, 25, 0, 0) 
    datetime.datetime(2016, 8, 9, 7, 30, 0, 0) 
    datetime.datetime(2016, 8, 9, 7, 35, 0, 0) 
    datetime.datetime(2016, 8, 9, 7, 45, 0, 0) 
    datetime.datetime(2016, 8, 9, 7, 55, 0, 0) 
    datetime.datetime(2016, 8, 9, 8, 00, 0, 0) 
    datetime.datetime(2016, 8, 9, 8, 05, 0, 0) 
    datetime.datetime(2016, 8, 9, 8, 10, 0, 0) 
    datetime.datetime(2016, 8, 9, 8, 15, 0, 0) 
    datetime.datetime(2016, 8, 9, 8, 20, 0, 0) 
] 

私はまだちょうど上記の説明のようにタイムスタンプを出す機能(非常にニシキヘビ)を実装する方法を把握しようとしています。

これらの2つの日付(date_aとdate_b)の間の範囲は、その例よりも大きくても小さくてもかまいません。したがって、1日または1週間の間隔を取ることは、その機能でカバーする必要があります。

答えて

2

非常にニシキヘビが、クリーンかつ簡潔ない:

from datetime import timedelta 

delta = timedelta(minutes=5) 
five_min_timestamps = [] 
date_x = date_a 
while date_x < date_b: 
    date_x += timedelta(minutes=5) 
    five_min_timestamps.append(date_x) 

別のオプションは、リストの内包表記を使用することです:

intervals = divmod((date_b - date_a).total_seconds(), 300) 
five_min_timestamps = [date_a + i * datetime.timedelta(minutes=5) for i in range(intervals)] 

intervals変数はあなたを示して、あなたはどのように多く、このタイムスパンでの間隔が必要なのか(日付を300で割った差)。

または1つの文で

five_min_timestamps = [ 
    date_a + i * datetime.timedelta(minutes=5) 
    for i in range(
     divmod((date_b - date_a).total_seconds(), 300))] 
0

低い時間aとトップタイムb間隔のリストを返す関数を定義します。

def print_time(a, b, inter): 
    tmp = a + datetime.timedelta(0,interval) # sum an interval of inter secs 
    list = [] 
    while tmp < b: 
     list.add(tmp) 
     tmp = tmp + datetime.timedelta(0,interval) # sum the interval again 
    return list 

結果リストには秒単位で区切られた日付時刻があります。

Toby Speightによって提案された収量のバージョン:

def print_time(a, b, inter): 
    tmp = a + datetime.timedelta(0,interval) # sum an interval of inter secs 
    while tmp < b: 
     yield tmp 
     tmp = tmp + datetime.timedelta(0,interval) # sum the interval again 
+0

yieldバージョンについては、リストvarialbを削除して要素を返すだけですか? – Raskayu

+0

提案が追加されました:) – Raskayu

2

あなたはまた、rrule module from dateutilを使用してに見ることができます。

をRRULEモジュールは、再発規則の、小さな完全な、と非常に高速、 実装を提供しています結果のキャッシュのサポートを含む、iCalendar RFCで文書化されています。

サンプル:can make "a few stops"Delorean libraryをしばしば見落とさもあります

>>> import datetime 
>>> 
>>> date_a = datetime.datetime(2016, 8, 9, 8, 24, 30, 993352) 
>>> date_b = datetime.datetime(2016, 8, 9, 7, 24, 30, 993352) 
>>> 
>>> from dateutil import rrule 
>>> 
>>> list(rrule.rrule(rrule.MINUTELY, interval=5, dtstart=date_b + datetime.timedelta(minutes=1), until=date_a)) 
[ 
    datetime.datetime(2016, 8, 9, 7, 25, 30), 
    datetime.datetime(2016, 8, 9, 7, 30, 30), 
    datetime.datetime(2016, 8, 9, 7, 35, 30), 
    datetime.datetime(2016, 8, 9, 7, 40, 30), 
    datetime.datetime(2016, 8, 9, 7, 45, 30), 
    datetime.datetime(2016, 8, 9, 7, 50, 30), 
    datetime.datetime(2016, 8, 9, 7, 55, 30), 
    datetime.datetime(2016, 8, 9, 8, 0, 30), 
    datetime.datetime(2016, 8, 9, 8, 5, 30), 
    datetime.datetime(2016, 8, 9, 8, 10, 30), 
    datetime.datetime(2016, 8, 9, 8, 15, 30), 
    datetime.datetime(2016, 8, 9, 8, 20, 30) 
]