Làm việc với datetime trong Pandas đôi khi có thể khó khăn nếu cột datetime của bạn là một chuỗi có định dạng lộn xộn, hỗn hợp. Bạn sẽ cần thực hiện một số bước tiền xử lý và chuyển đổi các định dạng hỗn hợp thành loại datetime tiêu chuẩn để thực hiện mọi phân tích dữ liệu tiếp theo
Hãy cùng xem ví dụ sau. Trong khung dữ liệu này, chúng tôi có một cột có tên là 'joining_date' có vẻ là cột datetime nhưng thực ra là cột chuỗi. Hơn nữa, tất cả các ngày đều được sắp xếp theo các định dạng khác nhau
Ví dụ: đối với ID a0001, chuỗi ngày được sắp xếp trong DD. MM. Định dạng YYYY trong đó ngày được viết đầu tiên. Đối với ID a0005, chuỗi ngày được hiển thị ở định dạng DD-MM-YY trong đó ngày cũng được viết trước. Đối với ID a0002, chuỗi ngày được sắp xếp theo định dạng MM/DD/YYYY với tháng được viết trước, điều này phổ biến ở Hoa Kỳ. S
Hình ảnh của tác giả
Vậy chúng ta có thể làm gì để xóa cột chuỗi ngày lộn xộn có nhiều định dạng khác nhau một cách dễ dàng và hiệu quả?
Trước tiên, hãy thử phương pháp to_datetime() của Pandas có thể phân tích cú pháp bất kỳ chuỗi ngày hợp lệ nào thành datetime một cách dễ dàng. Nếu chúng tôi chỉ đơn giản làm như sau mà không có bất kỳ đối số bổ sung nào, chúng tôi sẽ nhận được kết quả hiển thị bên dưới
df['joining_date'] = pd.to_datetime(df['joining_date'])Hình ảnh của tác giả
Chúng ta có thể thấy rằng với phương thức df['joining_date'] = pd.to_datetime(df['joining_date'], dayfirst=True)0, chúng ta có thể phân tích các chuỗi ngày có định dạng hỗn hợp thành datetime với định dạng chuẩn (mặc định là YYYY-MM-DD). Vì df['joining_date'] = pd.to_datetime(df['joining_date'], dayfirst=True)0 theo mặc định phân tích chuỗi có định dạng tháng đầu tiên (MM/DD, MM DD hoặc MM-DD), nên nó trộn lẫn ngày và tháng cho các chuỗi ngày với định dạng ngày đầu tiên (e. g. , ĐD. MM. YYYY cho những ngày có dấu gạch chéo màu đỏ)
Để khắc phục sự cố này, chúng ta chỉ cần thêm đối số df['joining_date'] = pd.to_datetime(df['joining_date'], dayfirst=True)3 vào mã bên dưới
df['joining_date'] = pd.to_datetime(df['joining_date'], dayfirst=True)Hình ảnh của tác giả
Vâng. Vì vậy, điều này đã khắc phục vấn đề trước đó nhưng tạo ra một vấn đề mới. Đối với chuỗi ngày có định dạng MM/DD/YYYY (hàng 7), vì chúng tôi đặt đối số df['joining_date'] = pd.to_datetime(df['joining_date'], dayfirst=True)4 thành df['joining_date'] = pd.to_datetime(df['joining_date'], dayfirst=True)5, nó đã chuyển đổi 3/5/2016 thành 2016–03–05, coi 5 là ngày và 3 là
Để khắc phục sự cố mới này, chúng ta có thể áp dụng điều kiện df['joining_date'] = pd.to_datetime(df['joining_date'], dayfirst=True)6 để chỉ đặt đối số df['joining_date'] = pd.to_datetime(df['joining_date'], dayfirst=True)4 thành df['joining_date'] = pd.to_datetime(df['joining_date'], dayfirst=True)5 cho các chuỗi ngày có ngày được viết trước
df['joining_date_clean'] = np.where(df['joining_date'].str.contains('/'), pd.to_datetime(df['joining_date']), pd.to_datetime(df['joining_date'], dayfirst=True))Hình ảnh của tác giả
Nó hoạt động. Bây giờ chúng ta có một cột ngày rõ ràng hơn nhiều để làm việc với. Xin lưu ý rằng bạn cũng có thể chỉ định định dạng ngày đầu ra khác với định dạng mặc định, bằng cách sử dụng phương thức df['joining_date'] = pd.to_datetime(df['joining_date'], dayfirst=True)9. Ví dụ: bạn có thể chọn hiển thị ngày đầu ra là MM/DD/YYYY bằng cách chỉ định df['joining_date_clean'] = np.where(df['joining_date'].str.contains('/'), pd.to_datetime(df['joining_date']), pd.to_datetime(df['joining_date'], dayfirst=True))0
df['joining_date_clean'] = np.where(df['joining_date'].str.contains('/'), pd.to_datetime(df['joining_date']).dt.strftime('%m/%d/%Y'), pd.to_datetime(df['joining_date'], dayfirst=True).dt.strftime('%m/%d/%Y'))Hình ảnh của tác giả
của bạn đi. Không cần thực hiện bất kỳ thao tác chuỗi ưa thích nào, chúng tôi có thể chuyển đổi chuỗi ngày lộn xộn trong tập dữ liệu gốc thành cột datetime tiêu chuẩn. Tôi hy vọng bạn đã học được một số thủ thuật về cách làm việc với các cột chuỗi ngày lộn xộn trong Pandas. Cảm ơn đã đọc và hy vọng bạn thích hướng dẫn ngắn này
Nguồn dữ liệu
Bộ dữ liệu mẫu được sử dụng trong bài đăng này được tạo bởi tác giả cho mục đích trình diễn
Bạn có thể mở khóa toàn quyền truy cập vào bài viết của tôi và phần còn lại của Phương tiện bằng cách đăng ký làm thành viên Phương tiện ($5 mỗi tháng) thông qua liên kết giới thiệu này. Bằng cách đăng ký qua liên kết này, tôi sẽ nhận được một phần phí thành viên của bạn mà bạn không phải trả thêm phí. Cảm ơn bạn