Saya memiliki dumpfile CSV dari cadangan IPD Blackberry, dibuat menggunakan IPDDump. String tanggal / waktu di sini terlihat seperti ini (di mana EST
zona waktu Australia):
Tue Jun 22 07:46:22 EST 2010
Saya harus dapat menguraikan tanggal ini dengan Python. Pada awalnya, saya mencoba menggunakan strptime()
fungsi dari datettime.
>>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z')
Namun, untuk beberapa alasan, datetime
objek yang kembali sepertinya tidak ada tzinfo
hubungannya dengan itu.
Saya memang membaca pada halaman ini yang tampaknya datetime.strptime
membuang dengan diam-diam tzinfo
, namun, saya memeriksa dokumentasinya, dan saya tidak dapat menemukan apa pun mengenai efek yang didokumentasikan di sini .
Saya sudah bisa mendapatkan tanggal diuraikan menggunakan perpustakaan Python pihak ketiga, dateutil , namun saya masih penasaran bagaimana saya menggunakan in-built yang strptime()
salah? Apakah ada cara untuk bisa strptime()
bermain bagus dengan zona waktu?
Jawaban:
The
datetime
dokumentasi modul mengatakan:Lihat itu
[0:6]
? Itu membuat Anda(year, month, day, hour, minute, second)
. Tidak ada lagi. Tidak disebutkan zona waktu.Menariknya, [Win XP SP2, Python 2.6, 2.7] meneruskan contoh Anda untuk
time.strptime
tidak bekerja tetapi jika Anda menghapus "% Z" dan "EST" itu berhasil. Juga menggunakan "UTC" atau "GMT" bukannya "EST" bekerja. "PST" dan "MEZ" tidak berfungsi. Membingungkan.Perlu dicatat bahwa ini telah diperbarui pada versi 3.2 dan dokumentasi yang sama sekarang juga menyatakan sebagai berikut:
Perhatikan bahwa ini tidak bekerja dengan% Z, jadi kasing itu penting. Lihat contoh berikut:
sumber
Saya sarankan menggunakan python-dateutil . Parsernya telah dapat mengurai setiap format tanggal yang saya berikan sejauh ini.
dan seterusnya. Tidak berurusan dengan
strptime()
format omong kosong ... cukup ajukan kencan padanya dan itu Melakukan Hal yang Benar.Pembaruan : Ups. Saya melewatkan pertanyaan asli Anda yang Anda sebutkan tadi
dateutil
, maaf tentang itu. Tapi saya harap jawaban ini masih berguna bagi orang lain yang menemukan pertanyaan ini ketika mereka memiliki pertanyaan penguraian dan melihat kegunaan modul itu.sumber
>>> parser.parse("Thu, 25 Sep 2003 10:49:41,123 -0300") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/wanghq/awscli/lib/python2.7/site-packages/dateutil/parser.py", line 748, in parse return DEFAULTPARSER.parse(timestr, **kwargs) File "/Users/wanghq/awscli/lib/python2.7/site-packages/dateutil/parser.py", line 310, in parse res, skipped_tokens = self._parse(timestr, **kwargs) TypeError: 'NoneType' object is not iterable
parser.parse("Thu, 25 Sep 2003 10:49:41.123 -0300") returns: datetime.datetime(2003, 9, 25, 10, 49, 41, 123000, tzinfo=tzoffset(None, -10800))
dateutil.parser.parse("10-27-2016 09:06 AM PDT")
pengembalian:datetime.datetime(2016, 10, 27, 9, 6)
gagal menentukan zona waktu ...dateutil parser
mungkin mudah digunakan, tetapistrptime()
lebih cepat. Selain itu, formatnya cukup mudah dipelajari.String waktu Anda mirip dengan format waktu di rfc 2822 (format tanggal dalam email, tajuk http) . Anda dapat menguraikannya hanya dengan stdlib:
Lihat solusi yang menghasilkan objek waktu-sadar datzone untuk berbagai versi Python: menguraikan tanggal dengan zona waktu dari email .
Dalam format ini,
EST
secara semantik setara dengan-0500
. Padahal, secara umum, singkatan zona waktu tidak cukup, untuk mengidentifikasi zona waktu secara unik .sumber
Berlari ke masalah yang tepat ini.
Apa yang akhirnya saya lakukan:
sumber