2011-07-14 32 views
5

Mô-đun datetime thực hiện xác nhận ngày và toán học là tốt khi bạn quan tâm đến thực tế.cho phép các ngày không hợp lệ trong datthon datetime

Tôi cần một đối tượng chứa ngày được tạo ngay cả khi chúng không hợp lệ. Thời gian ngày là quá nghiêm ngặt như đôi khi tôi biết chỉ năm hoặc năm và tháng và đôi khi tôi có một ngày như 2011-02-30.

Có mô-đun ngoài đó giống như datetime nhưng có thể xử lý ngày không hợp lệ không?

Nếu không, cách tốt nhất để xử lý điều này khi sao chép ít chức năng nhất có thể và vẫn cho phép tính toán ngày khi có thể thực hiện?

CẬP NHẬT

Động lực cho điều này là tích hợp với nhiều hệ thống sử dụng ngày và không quan tâm đến số ngày không hợp lệ (mysql và perl) ngoài việc muốn khả năng nói với dãy chung cơ bản của thời gian. Đối với toán ngày tháng mờ bắt đầu từ đầu đơn vị thời gian đã biết (nếu tôi biết năm và tháng nhưng không phải ngày, hãy dùng ngày đầu tiên, nếu tôi biết năm nhưng không có tháng hoặc ngày, hãy sử dụng tháng đầu tiên). Bit cuối cùng này là không cần thiết nhưng sẽ tốt đẹp và tôi nhận được lý do tại sao nó không phải là phổ biến như những người cần toán học ngày đặc biệt có thể sẽ tự xây dựng nó.

Một trong những vấn đề chính tôi có là tải ngày từ mysql vào python sử dụng sqlalchemy và mysqldb - nếu bạn tải một giá trị từ một cột ngày im mysql trông giống như '2011-01-00' trong mysql, bạn nhận được Không có trong python. Đây không phải là mát mẻ bởi bất kỳ căng.

+1

Sẽ không hẹn hò toán học khó khăn khi bạn không biết bao nhiêu ngày có nói, mỗi tháng? Có lẽ tôi không hoàn toàn hiểu những gì bạn đang tìm kiếm. –

+0

@Pat B Dự đoán của tôi là: giả sử cuộc sống thực cho đến khi khởi hành. Ngoài ra, @SynapticUnderrun Bạn có thể nhận được một số phản hồi nhiều hơn nếu bạn giải thích lý do tại sao bạn muốn/cần điều này (Ngoài ra tôi chỉ quan tâm). – Wilduck

+1

Nếu bạn không quan tâm xem ngày đó có hợp lệ hay không, hãy lưu trữ ngày đó dưới dạng chuỗi. Mô-đun datetime sử dụng thời gian epoch nội bộ để nó sẽ theo lịch. Ngoài ra hãy kiểm tra các mô-đun pytz để hỗ trợ múi giờ nếu đó là lý do bạn quan tâm đến khoan dung. – wberry

Trả lời

2

Nếu mô-đun ngày giờ quá nghiêm ngặt, hãy lưu nó dưới dạng một chuỗi hoặc một bộ đệm được đệm bằng số không cho các giá trị không xác định.

Chỉnh sửa nếu bạn gặp sự cố khi dịch từ mysql sang python, hãy viết cho mình lớp bộ điều hợp để thực hiện chuyển đổi một cách an toàn (xem Changing attribute behaviour).

Edit2 một lựa chọn đơn giản có thể là để viết một kịch bản ngắn để chạy qua tất cả các ngày SQL của bạn và thực hiện điều chỉnh có nghĩa là thay đổi 2011-01-00 đến 2011-01-01

Edit3 Các tài liệu đề xuất bạn có thể override reflected columns để bạn có thể xem các cột dấu thời gian của mình dưới dạng chuỗi ... hoặc trong các phiên bản sau của SQLAlchemy, bạn có thể sử dụng the column_property để ghi đè.

+0

làm thế nào để tôi nhận được mysqldb sử dụng lớp học của tôi thay vì datetime? – underrun

+0

lớp bộ chuyển đổi không âm thanh vui nhộn, thay đổi ngày không hợp lệ là thay đổi dữ liệu thực tế ở đó (không được phép trong phạm vi dự án của tôi, nhưng tùy chọn sqlalchemy column_property trông giống như những gì tôi muốn (thuộc tính là một diễn viên() của cột của tôi). – underrun

0

Tôi chưa từng nghe mô-đun như vậy và không nghĩ rằng có một mô-đun.

Tôi có thể sẽ lưu trữ hai ngày cho mỗi trường hợp: 1. đầu vào gốc dưới dạng chuỗi, có thể chứa bất kỳ thứ gì, thậm chí "Không có", chỉ để hiển thị lại giá trị ban đầu và phân tích cú pháp. đối tượng datetime "bình thường hóa" là biểu diễn gần nhất của đầu vào. Tùy thuộc vào mục đích tôi sẽ cho phép các đối tượng Null/None mà nó thực sự không thể được ước tính (như trường hợp "N/A" đã đề cập) hay không. Giải pháp này sẽ cho phép bạn hoàn nguyên/thay đổi "ước tính" khi bạn không mất bất kỳ thông tin nào.

Nếu bạn không quan tâm đến nó, SQLAlchemy cho phép khai báo cột và kiểu dữ liệu của riêng bạn để chuyển đổi một cách minh bạch các giá trị đó qua lại thành một cột chuỗi trong DB.

Các vấn đề liên quan