Cách chuyển đổi dấu thời gian nguyên sang datetime của Python


187

Tôi có một tệp dữ liệu chứa dấu thời gian như "1331856000000". Thật không may, tôi không có nhiều tài liệu cho định dạng, vì vậy tôi không chắc cách dấu thời gian được định dạng. Tôi đã cố gắng chuẩn của Python datetime.fromordinal()datetime.fromtimestamp()và một vài người khác, nhưng trận đấu không có gì. Tôi khá chắc chắn rằng con số cụ thể tương ứng với ngày hiện tại (ví dụ 2012-3-16), nhưng không nhiều hơn nữa.

Làm thế nào để tôi chuyển đổi số này thành một datetime?

Câu trả lời:


328

datetime.datetime.fromtimestamp()là chính xác, ngoại trừ bạn có thể có dấu thời gian tính bằng milisecond (như trong JavaScript), nhưng fromtimestamp()mong đợi dấu thời gian Unix, tính bằng giây.

Làm như thế:

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

và kết quả là:

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

Nó có trả lời câu hỏi của bạn không?

EDIT : JF Sebastian đề nghị chính xác sử dụng phép chia thực sự theo 1e3(float 1000). Sự khác biệt là rất đáng kể, nếu bạn muốn có kết quả chính xác, do đó tôi đã thay đổi câu trả lời của mình. Kết quả khác biệt từ hành vi mặc định của Python 2.x, luôn trả về intkhi chia (sử dụng /toán tử) intcho int(đây được gọi là phân chia sàn ). Bằng cách thay thế số chia 1000(là một int) bằng 1e3số chia (là đại diện của 1000float) hoặc bằng float(1000)(hoặc 1000.v.v.), phép chia trở thành phép chia thực sự . Python 2.x trả về floatkhi chia intcho float, floatbởi int,floatbởi floatv.v. Và khi có một phần phân số trong dấu thời gian được truyền cho fromtimestamp()phương thức, kết quả của phương thức này cũng chứa thông tin về phần phân số đó (dưới dạng số micrô giây).


13
sử dụng phân chia thực sự:/ 1e3
jfs

@JFSebastian: Bạn hoàn toàn chính xác, tôi đã chỉnh sửa câu trả lời của mình và thêm một số giải thích tại sao bạn đúng. Nếu bạn không đồng ý với lời giải thích, xin vui lòng cho tôi biết.
Tadeck

@ manu-fatto: Điều đó không thực sự quan trọng. x * 0.001x / 1e3đều giống nhau, sự khác biệt nằm ở ký hiệu và độ dài (bản gốc ngắn hơn). Đối với một số người, có thể rõ ràng hơn khi thực sự chia cho số thay vì nhân với số nghịch đảo nhân ( 1/x) mà bạn đề xuất. Nhưng cảm ơn vì đã đề xuất phương pháp thay thế.
Tadeck

57
Chức năng này là nguy hiểm, vì bạn sẽ cân nhắc múi giờ. Hãy thử tra cứu utcfromtimestamp
Haim Bender

11
@HaimBender Cảm ơn! Tôi cảm thấy như ý kiến ​​của bạn xứng đáng được chú ý nhiều hơn. fromtimestampcung cấp cho bạn ngày và giờ theo giờ địa phương utcfromtimestampcung cấp cho bạn ngày và giờ trong UTC.
yusong
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.