4

パンダを使用して週末を除くPythonの日時に秒を追加しようとしています。以下のコードは機能しますが、これを実現するためのより簡単な方法があるかどうかを知りたいと思います。

import datetime
from pandas import *
from pandas.tseries.offsets import *

def add_seconds(start_date, offset_in_seconds):
# get input date in datetime
d = datetime.strptime(start_date, '%Y-%m-%d %H:%M:%S')

# get days, hours, mins, secs
    no_of_days, remainder = divmod(offset_in_seconds, 86400)
    hours, minutes = divmod(remainder, 3600)
    minutes, seconds = divmod(minutes, 60)

# increment the input date  to the appropriate business day
    end_date_pre = d + no_of_days*BDay() 

# dial back to previous evening if hour is under 24
    if 16 + hours < 24:
    end_date = end_date_pre 
    new_end_date = datetime(end_date.year, end_date.month, end_date.day, 16, 0, 0)
    return start_date, end_date, new_end_date.strftime('%Y-%m-%d %H:%M:%S')
# dial forward to the next business day if hour exceeds 24
    elif 16 + hours >= 24:
    end_date = end_date_pre + 1*BDay()
    new_end_date = datetime(end_date.year, end_date.month, end_date.day,9, 0, 0)
    return start_date, end_date, new_end_date.strftime('%Y-%m-%d %H:%M:%S')
    else:
    return start_date, end_date, end_date.strftime('%Y-%m-%d %H:%M:%S')
4

1 に答える 1

4

dateutilパッケージが役立つはずです。

from dateutil.rrule import *    

def add_weekday_seconds(start, x):
    rr = rrule(SECONDLY, byweekday=(MO, TU, WE, TH, FR), dtstart=start, interval=x)
    return rr.after(start)

これは(1)rruleクラスを使用して、月曜日から金曜日までのすべての秒startdatetime)から始まり、毎秒スキップする「繰り返し日付ルール」を作成しxます。次に、(2)after開始時刻の後にルールに一致する最初の日時を返すメソッドを使用してこのルールを実行します。これがあなたの答えになるはずです。

金曜日の夜の真夜中の10秒前の開始時刻に5、10、および15秒を追加して、金曜日の真夜中の5秒前、月曜日の朝の真夜中、および月曜日の朝の真夜中から5秒後にそれぞれ追加するテスト。

In [131]: friday_night = datetime.datetime(2012, 8, 10, 23, 59, 50)

In [132]: add_weekday_seconds(friday_night, 5)
Out[132]: datetime.datetime(2012, 8, 10, 23, 59, 55)

In [133]: add_weekday_seconds(friday_night, 10)
Out[133]: datetime.datetime(2012, 8, 13, 0, 0)

In [134]: add_weekday_seconds(friday_night, 15)
Out[134]: datetime.datetime(2012, 8, 13, 0, 0, 5)
于 2012-08-09T16:41:40.247 に答える