10

私のクラウドサーバーは次の形式で時間を記録します:

[17/Dec/2011:09:48:49 -0600]

Python変数に読み込むには、次のように言うことができます。

>>>str = '17/Dec/2011:09:48:49 -0600'
>>>import time
>>>print  time.strptime(str,"%d/%b/%Y:%H:%M:%S -0600")

結果:

time.struct_time(tm_year=2011, tm-mon=12, tm=mday=17, tm_hour=9, tm_min=48, tm_sec=49, tm_wday=5, tm_yday=351, tm_isdst=-1)

または私は試すことができます

>>>mytime = time.strptime(str,"%d/%b/%Y:%H:%M:%S -0600")
>>>print mytime.tm_hour

結果:

9

何をし-0600ますか?日時オブジェクトの時間値を調整することを期待していましたか?をハードコーディングする代わりに使用するワイルドカードはあり-0600ますか?

4

3 に答える 3

15

-0600グリニッジ標準時(GMT)からのオフセットです。別のSOの質問ですでに述べているように、time.strptimeはタイムゾーンオフセットを読み取ることはできませんが、datetime.strftime生成することはできます。

モジュールのドキュメントdatetime冒頭で説明したように、Pythonで「時間」にアプローチするには、ナイーブまたはアウェアの2つの方法があります。システム内の時間だけが気になる場合は、ナイーブな時刻/日時オブジェクトを処理するのが適切です(この場合、alanが提案したようにオフセットを取り除くことができます)。システム内の値を実際の時間の概念と比較する必要がある場合は、そのオフセットの処理を開始する必要があります。

これに対処する簡単な方法は、を使用することpython-dateutilです。これには、渡した日付文字列を複数の形式にあいまいに一致させ、意味についての最良の推測を表す実行可能な日時インスタンスを返すために最善を尽くす解析関数があります。

>>> from dateutil.parser import parse
>>> parse('17/Dec/2011:09:48:49 -0600', fuzzy=True)
datetime.datetime(2011, 12, 17, 9, 48, 49, tzinfo=tzoffset(None, -21600))

通常、ソフトウェアに「最良の推測」を与えることは悪いことです。この場合、入力フォーマットが安定していれば正当化されるようです。ソフトウェア開発の時間に対処するのは難しいです。買い物に行くだけです。

于 2012-04-24T14:55:53.323 に答える
3

GMTからのオフセットです。不要な場合は、削除してください。

>>> import time
>>> line = '17/Dec/2011:09:48:49 -0600'
>>> line = line.split(' ')[0]
>>> print  time.strptime(line,"%d/%b/%Y:%H:%M:%S")
time.struct_time(tm_year=2011, tm_mon=12, tm_mday=17, tm_hour=9, tm_min=48,  tm_sec=49, tm_wday=5, tm_yday=351, tm_isdst=-1)
于 2012-04-24T12:50:23.210 に答える
2

strptime修飾子(、、 ...)を文字列の対応するセグメントと単純に一致%dさせ%bてから、一致した文字列を整数に変換します。したがって、あなたの場合、-0600フォーマット文字列が入力文字列と一致するようにするだけです。

指定したオフセットで時間を調整したい場合は、datetimeオブジェクトの使用をお勧めします。

>>>s = '17/Dec/2011:09:48:49 -0600'
>>>from datetime import datetime,timedelta
>>>mytime = datetime.strptime(s,"%d/%b/%Y:%H:%M:%S -0600")
>>>dt = timedelta(minutes=6*60)  #6 hours
>>>mytime-=dt
>>>print mytime
2011-12-17 03:48:49
>>>print mytime.hour
3

また、strは組み込みであるため、通常、再割り当てすることはお勧めできません。

于 2012-04-24T12:50:59.250 に答える