วิธีการแปลงเวลาประทับจำนวนเต็มเป็น Python datetime


189

ฉันมีไฟล์ข้อมูลที่มีการประทับเวลาเช่น "1331856000000" น่าเสียดายที่ฉันไม่มีเอกสารจำนวนมากสำหรับรูปแบบดังนั้นฉันไม่แน่ใจว่ารูปแบบการประทับเวลาถูกจัดรูปแบบอย่างไร ฉันลองใช้มาตรฐานของ Python datetime.fromordinal()แล้วdatetime.fromtimestamp()และอีกสองสามอย่าง แต่ไม่มีอะไรที่ตรงกัน ฉันค่อนข้างแน่ใจว่าหมายเลขเฉพาะตรงกับวันที่ปัจจุบัน (เช่น 2012-3-16) แต่ไม่มาก

ฉันจะแปลงหมายเลขนี้เป็น a ได้datetimeอย่างไร

คำตอบ:


329

datetime.datetime.fromtimestamp()ถูกต้องยกเว้นคุณอาจมีการประทับเวลาในหน่วยมิลลิวินาที (เช่นใน JavaScript) แต่fromtimestamp()คาดว่า Unix Timestamp จะมีหน่วยเป็นวินาที

ทำเช่นนั้น:

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

และผลลัพธ์คือ:

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

มันตอบคำถามของคุณหรือไม่

แก้ไข : JF Sebastian แนะนำให้ใช้การหารที่แท้จริงด้วย1e3(ลอย1000) ความแตกต่างนั้นสำคัญถ้าคุณต้องการได้ผลลัพธ์ที่แม่นยำดังนั้นฉันจึงเปลี่ยนคำตอบ ความแตกต่างเป็นผลมาจากพฤติกรรมเริ่มต้นของ Python 2.x ซึ่งจะส่งกลับเสมอintเมื่อทำการหาร (โดยใช้/โอเปอเรเตอร์) intโดยint(ซึ่งเรียกว่าการหารพื้น ) โดยการแทนที่ตัวหาร1000(เป็นint) ที่มี1e3ตัวหาร (เป็นตัวแทนของ1000เป็น float) หรือfloat(1000)(หรือ1000.อื่น ๆ ) ส่วนที่จะกลายเป็นส่วนจริง Python 2.x ส่งกลับfloatเมื่อหารintด้วยfloat, floatโดยint,floatด้วยfloatเป็นต้นและเมื่อมีเศษส่วนบางส่วนในการประทับเวลาที่ส่งผ่านไปยังfromtimestamp()วิธีการผลของวิธีการนี้ยังมีข้อมูลเกี่ยวกับส่วนที่เศษส่วนนั้น (ตามจำนวนไมโครวินาที)


13
ใช้การหารที่แท้จริง:/ 1e3
jfs

@JFSebastian: คุณถูกต้องทั้งหมดฉันได้แก้ไขคำตอบของฉันและเพิ่มคำอธิบายว่าทำไมคุณถึงพูดถูก หากคุณไม่เห็นด้วยกับคำอธิบายโปรดแจ้งให้เราทราบ
Tadeck

@ manu-fatto: นั่นไม่สำคัญจริงๆ x * 0.001และx / 1e3ทั้งสองเหมือนกันความแตกต่างคือในสัญกรณ์และความยาว (อันต้นฉบับสั้นกว่า) สำหรับบางคนการหารด้วยจำนวนจริงอาจชัดเจนกว่าการคูณด้วยหมายเลขอินเวอร์สการคูณ ( 1/x) ที่คุณเสนอ แต่ขอบคุณที่เสนอวิธีการทางเลือก
Tadeck

58
ฟังก์ชั่นนี้มีอันตรายเพราะจะนำคุณพิจารณาเขตเวลา ลองค้นหา utcfromtimestamp
ฮาอิมเบนเดอร์

12
@HaimBender ขอบคุณ! ฉันรู้สึกเหมือนความคิดเห็นของคุณสมควรได้รับความสนใจมากขึ้น fromtimestampให้วันที่และเวลาในเวลาท้องถิ่นกับutcfromtimestampคุณให้วันที่และเวลาเป็น UTC
yusong
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.