Bagaimana cara mengubah integer timestamp ke data Python

189

Saya memiliki file data yang berisi cap waktu seperti "1331856000000". Sayangnya, saya tidak memiliki banyak dokumentasi untuk format, jadi saya tidak yakin bagaimana cap waktu diformat. Saya sudah mencoba standar Python datetime.fromordinal()dan datetime.fromtimestamp()dan beberapa orang lainnya, tapi tidak ada pertandingan. Saya cukup yakin bahwa nomor tertentu sesuai dengan tanggal saat ini (mis. 2012-3-16), tetapi tidak lebih.

Bagaimana cara mengubah nomor ini menjadi a datetime?

Cerin
sumber

Jawaban:

329

datetime.datetime.fromtimestamp() benar, kecuali Anda mungkin memiliki stempel waktu dalam milidetik (seperti dalam JavaScript), tetapi fromtimestamp() mengharapkan cap waktu Unix, dalam hitungan detik.

Lakukan seperti itu:

>>> import datetime
>>> your_timestamp = 1331856000000
>>> date = datetime.datetime.fromtimestamp(your_timestamp / 1e3)

dan hasilnya adalah:

>>> date
datetime.datetime(2012, 3, 16, 1, 0)

Apakah itu menjawab pertanyaan Anda?

EDIT : JF Sebastian dengan benar menyarankan untuk menggunakan pembagian sejati dengan 1e3(float 1000). Perbedaannya signifikan, jika Anda ingin mendapatkan hasil yang tepat, maka saya mengubah jawaban saya. Perbedaan hasil dari perilaku default Python 2.x, yang selalu kembali intketika membagi (menggunakan /operator) intdengan int(ini disebut pembagian lantai ). Dengan mengganti pembagi 1000(menjadi int) dengan 1e3pembagi (menjadi representasi 1000sebagai pelampung) atau dengan float(1000)(atau 1000.dll.), Pembagian menjadi pembagian yang benar . Python 2.x kembali floatsaat membaginya intdengan float, floatoleh int,float olehfloatdll. Dan ketika ada beberapa bagian fraksional di stempel waktu yang dilewati ke fromtimestamp()metode, hasil metode ini juga berisi informasi tentang bagian fraksional itu (seperti jumlah mikrodetik).

Tadeck
sumber
13
gunakan pembagian sejati:/ 1e3
jfs
@ JSFSebastian: Anda sepenuhnya benar, saya telah mengedit jawaban saya dan menambahkan beberapa penjelasan mengapa Anda benar. Jika Anda tidak setuju dengan penjelasannya, harap beri tahu saya.
Tadeck
@ manu-fatto: Itu tidak masalah. x * 0.001dan x / 1e3keduanya sama, perbedaannya adalah dalam notasi dan panjang (yang asli lebih pendek). Untuk beberapa orang mungkin lebih jelas untuk benar-benar membagi dengan angka daripada mengalikan dengan angka terbalik multiplikatif ( 1/x), yang Anda usulkan. Tetapi terima kasih telah mengusulkan pendekatan alternatif.
Tadeck
58
Fungsi ini berbahaya, karena membuat Anda mempertimbangkan zona waktu. Coba cari utcfromtimestamp
Haim Bender
12
@HaimBender Terima kasih! Saya merasa komentar Anda layak mendapat perhatian lebih. fromtimestampmemberi Anda tanggal dan waktu dalam waktu setempat utcfromtimestampmemberi Anda tanggal dan waktu dalam UTC.
yusong