17

Pythonで時刻と日付を処理する場合、time.struct_timeオブジェクトに遭遇します。

st = time.strptime("23.10.2012", "%d.%m.%Y")
print st
time.struct_time(tm_year=2012, tm_mon=10, tm_mday=23, tm_hour=0, tm_min=0,
                 tm_sec=0, tm_wday=1, tm_yday=297, tm_isdst=-1)

この構造体はアイテムの割り当てをサポートしていないため(つまり、次のようなことはできませんst[1]+=1)、たとえば月の数を増やすには、他にどのような方法がありますか。

ソリューションは、このtime_structを秒に変換し、対応する秒数を追加することを提案していますが、これは見栄えがよくありません。また、1か月の日数、またはうるう年かどうかも知る必要があります。time_structを取得する簡単な方法が必要です。

time.struct_time(tm_year=2012, tm_mon=11, tm_mday=23, tm_hour=0, tm_min=0,
                 tm_sec=0, tm_wday=1, tm_yday=297, tm_isdst=-1)

ちょうど月が1つ増えました。ゼロから作成するのtime_structは問題ありませんが、どうすればよいでしょうか。どのような方法がありますか?

4

4 に答える 4

23

datetime代わりにモジュールを使用してください。このモジュールには、日付(時刻)演算を処理するためのはるかに豊富なオブジェクトのセットがあります。

import datetime
adate = datetime.datetime.strptime("23.10.2012", "%d.%m.%Y").date()
adate + datetime.timedelta(days=30)

優れたpython-dateutilアドオンモジュールを使用して、デルタを処理するためのさらに豊富なオプションのセットを取得できます。

from dateutil.relativedelta import relativedelta
adate + relativedelta(months=1)

relativedeltaうるう年、月の長さなどを知っており、たとえば1月30日に月を追加すると正しい動作をします(2月28日または29日になると、月の境界を越えることはありません)。

于 2012-10-23T13:34:22.430 に答える
12

つまり...time_structの基礎となるタプルのスキーマは、次のドキュメントに記載されています: http ://docs.python.org/2/library/time.html#time.struct_time

また、time_structとして読み取り専用ですが、casting to list()を使用して、そのタプルを直接取得できます(月をインクリメントした後、月をラップアラウンドし、終了範囲を0ではなく1〜12に保つことを忘れないでください)。 -11)。次に、time.struct_time()関数は有効な9タプルをtime_structに変換し直します。

st = time.strptime("23.10.2012", "%d.%m.%Y")
st_writable = list(st)
st_writable[1] = (st_writable[1] + 1)%12 + 1
st = time.struct_time(tuple(st_writable))
于 2013-06-20T18:06:53.870 に答える
2

最初にそれを日時に変換し、次にタイムデルタオフセットを追加できます。

from time import mktime
from datetime import datetime

dt = datetime.fromtimestamp(mktime(struct))
timedelta = datetime.timedelta(seconds=10)
dt = dt + timedelta

参照:

  1. Pythonのtime.struct_timeオブジェクトをdatetimeオブジェクトにどのように変換しますか?
  2. http://docs.python.org/library/datetime.html
于 2012-10-23T13:36:48.700 に答える
1

日時をすべて一緒に避けて時間を維持したい場合は、UNIXタイムスタンプに変換してから、必要な秒数を引くことができます。24時間前の時間オブジェクトを取得するには:

time.gmtime(time.mktime(time.gmtime()) - 86400)

ただし、OPが指摘したように、これは数か月の作業には適していないため、数秒、数時間、および数日間予約する必要があります。

于 2016-05-12T19:42:54.157 に答える