Datetime là kiểu dữ liệu phổ biến trong các dự án khoa học dữ liệu. Thông thường, bạn sẽ làm việc với nó và gặp vấn đề. Tôi nhận thấy Pandas là một thư viện tuyệt vời chứa các khả năng và tính năng phong phú để làm việc với ngày và giờ
Trong bài viết này, chúng tôi sẽ đề cập đến các vấn đề về ngày giờ phổ biến sau đây và sẽ giúp bạn bắt đầu phân tích dữ liệu
- Chuyển chuỗi thành datetime
- Lắp ráp một datetime từ nhiều cột
- Nhận năm, tháng và ngày
- Nhận tuần trong năm, ngày trong tuần và năm nhuận
- Lấy tuổi từ ngày sinh
- Cải thiện hiệu suất bằng cách đặt cột ngày làm chỉ mục
- Chọn dữ liệu với một năm cụ thể và thực hiện tổng hợp
- Chọn dữ liệu với một tháng cụ thể và một ngày cụ thể trong tháng
- Chọn dữ liệu giữa hai ngày
- Xử lý các giá trị bị thiếu
Vui lòng kiểm tra repo Github của tôi để biết mã nguồn
1. Chuyển chuỗi thành datetime
Pandas có chức năng tích hợp có tên là
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',8 có thể được sử dụng để chuyển đổi chuỗi thành ngày giờ. Hãy xem xét một số ví dụ
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
Với đối số mặc định
Pandas
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',8 có thể phân tích bất kỳ chuỗi ngày hợp lệ nào thành datetime mà không cần thêm bất kỳ đối số nào. Ví dụ
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
df = pd.DataFrame[{'date': ['3/10/2000', '3/11/2000', '3/12/2000'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date']]
df
Định dạng ngày đầu tiên
Theo mặc định,
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',8 sẽ phân tích cú pháp chuỗi có định dạng tháng đầu tiên [MM/DD, MM DD hoặc MM-DD] và cách sắp xếp này tương đối độc đáo ở Hoa Kỳ
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
Ở hầu hết các nơi trên thế giới, ngày được viết trước [DD/MM, DD MM hoặc DD-MM]. Nếu bạn muốn Pandas xem xét ngày đầu tiên thay vì tháng, bạn có thể đặt đối số
# Make up 3000 rows1 thành
df = pd.DataFrame[{'date': ['3/11/2000', '3/12/2000', '3/13/2000'] * 1000 }]%timeit pd.to_datetime[df['date'], infer_datetime_format=True]
100 loops, best of 3: 10.4 ms per loop%timeit pd.to_datetime[df['date'], infer_datetime_format=False]
1 loop, best of 3: 471 ms per loop
# Make up 3000 rows2
df = pd.DataFrame[{'date': ['3/11/2000', '3/12/2000', '3/13/2000'] * 1000 }]%timeit pd.to_datetime[df['date'], infer_datetime_format=True]
100 loops, best of 3: 10.4 ms per loop%timeit pd.to_datetime[df['date'], infer_datetime_format=False]
1 loop, best of 3: 471 ms per loop
df = pd.DataFrame[{'date': ['3/10/2000', '3/11/2000', '3/12/2000'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], dayfirst=True]
df
Ngoài ra, bạn chuyển một định dạng tùy chỉnh cho đối số
# Make up 3000 rows3
df = pd.DataFrame[{'date': ['3/11/2000', '3/12/2000', '3/13/2000'] * 1000 }]%timeit pd.to_datetime[df['date'], infer_datetime_format=True]
100 loops, best of 3: 10.4 ms per loop%timeit pd.to_datetime[df['date'], infer_datetime_format=False]
1 loop, best of 3: 471 ms per loop
định dạng tùy chỉnh
Theo mặc định, các chuỗi được phân tích cú pháp bằng trình phân tích cú pháp tích hợp sẵn của Pandas từ
# Make up 3000 rows4. Đôi khi, chuỗi của bạn có thể ở định dạng tùy chỉnh, ví dụ: YYYY-DD-MM HH. MM. SS. Pandas
df = pd.DataFrame[{'date': ['3/11/2000', '3/12/2000', '3/13/2000'] * 1000 }]%timeit pd.to_datetime[df['date'], infer_datetime_format=True]
100 loops, best of 3: 10.4 ms per loop%timeit pd.to_datetime[df['date'], infer_datetime_format=False]
1 loop, best of 3: 471 ms per loop
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',8 có một đối số gọi là
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
# Make up 3000 rows3 cho phép bạn chuyển một định dạng tùy chỉnh
df = pd.DataFrame[{'date': ['3/11/2000', '3/12/2000', '3/13/2000'] * 1000 }]%timeit pd.to_datetime[df['date'], infer_datetime_format=True]
100 loops, best of 3: 10.4 ms per loop%timeit pd.to_datetime[df['date'], infer_datetime_format=False]
1 loop, best of 3: 471 ms per loop
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
Tăng tốc độ phân tích cú pháp với # Make up 3000 rows
df = pd.DataFrame[{'date': ['3/11/2000', '3/12/2000', '3/13/2000'] * 1000 }]%timeit pd.to_datetime[df['date'], infer_datetime_format=True]
100 loops, best of 3: 10.4 ms per loop%timeit pd.to_datetime[df['date'], infer_datetime_format=False]
1 loop, best of 3: 471 ms per loop
7
df = pd.DataFrame[{'date': ['3/11/2000', '3/12/2000', '3/13/2000'] * 1000 }]%timeit pd.to_datetime[df['date'], infer_datetime_format=True]
100 loops, best of 3: 10.4 ms per loop%timeit pd.to_datetime[df['date'], infer_datetime_format=False]
1 loop, best of 3: 471 ms per loop
Việc vượt qua
# Make up 3000 rows8 thường có thể tăng tốc độ phân tích cú pháp nếu định dạng đó không chính xác là định dạng ISO8601 mà ở định dạng thông thường. Theo [1], trong một số trường hợp, điều này có thể tăng tốc độ phân tích cú pháp lên 5–10 lần
df = pd.DataFrame[{'date': ['3/11/2000', '3/12/2000', '3/13/2000'] * 1000 }]%timeit pd.to_datetime[df['date'], infer_datetime_format=True]
100 loops, best of 3: 10.4 ms per loop%timeit pd.to_datetime[df['date'], infer_datetime_format=False]
1 loop, best of 3: 471 ms per loop
# Make up 3000 rows
df = pd.DataFrame[{'date': ['3/11/2000', '3/12/2000', '3/13/2000'] * 1000 }]%timeit pd.to_datetime[df['date'], infer_datetime_format=True]
100 loops, best of 3: 10.4 ms per loop%timeit pd.to_datetime[df['date'], infer_datetime_format=False]
1 loop, best of 3: 471 ms per loop
Xử lý lỗi phân tích cú pháp
Bạn sẽ kết thúc với TypeError nếu chuỗi ngày không đáp ứng định dạng dấu thời gian
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',5
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',8 có một đối số gọi là
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',50 cho phép bạn bỏ qua lỗi hoặc buộc một giá trị không hợp lệ thành
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',51
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',9
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
df = pd.DataFrame[{'date': ['3/10/2000', '3/11/2000', '3/12/2000'],0
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date']]
df
Ngoài ra, nếu bạn muốn phân tích cột ngày tháng khi đọc dữ liệu từ tệp CSV, vui lòng xem bài viết sau
4 thủ thuật bạn nên biết để phân tích cột ngày với Pandas read_csv[]
Một số thủ thuật Pandas hữu ích nhất
hướng tới khoa học dữ liệu. com
2. Lắp ráp một datetime từ nhiều cộtdf = pd.DataFrame[{'date': ['2016-6-10 20:30:0',8 cũng có thể được sử dụng để tập hợp một ngày giờ từ nhiều cột. Các khóa [nhãn cột] có thể là các từ viết tắt phổ biến như ['year', 'month', 'day', 'minute', 'second', 'ms', 'us', 'ns']] hoặc số nhiều của các từ giống nhau
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
df = pd.DataFrame[{'date': ['3/10/2000', '3/11/2000', '3/12/2000'],2
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date']]
df
3. Nhận năm, tháng và ngày
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',53,
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',54 và
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',55 là các thuộc tính sẵn có để lấy năm, tháng và ngày từ đối tượng ngày giờ của Pandas
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
Trước tiên, hãy tạo một DataFrame giả và phân tích Ngày thành ngày giờ
df = pd.DataFrame[{'date': ['3/10/2000', '3/11/2000', '3/12/2000'],6
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date']]
df
Và để có được năm, tháng và ngày
df = pd.DataFrame[{'date': ['3/10/2000', '3/11/2000', '3/12/2000'],7
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date']]
df
4. Nhận tuần trong năm, ngày trong tuần và năm nhuận
Tương tự,
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',56,
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',57 và
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',58 là các thuộc tính sẵn có để lấy tuần trong năm, ngày trong tuần và năm nhuận
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
df = pd.DataFrame[{'date': ['3/10/2000', '3/11/2000', '3/12/2000'],0
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], dayfirst=True]
df
Lưu ý rằng thuộc tính Pandas
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',59 trả về ngày trong tuần và giả định rằng tuần bắt đầu vào Thứ Hai, được biểu thị bằng 0 và kết thúc vào Chủ nhật, được biểu thị bằng 6. Để thay thế số bằng tên đầy đủ, chúng ta có thể tạo ánh xạ và chuyển nó tới
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',90
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
df = pd.DataFrame[{'date': ['3/10/2000', '3/11/2000', '3/12/2000'],1
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], dayfirst=True]
df
5. Lấy tuổi từ ngày sinh
Giải pháp đơn giản nhất để lấy tuổi là trừ đi năm
df = pd.DataFrame[{'date': ['3/10/2000', '3/11/2000', '3/12/2000'],2
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], dayfirst=True]
df
Tuy nhiên, điều này không chính xác vì mọi người có thể không có sinh nhật trong năm nay. Một giải pháp chính xác hơn sẽ là xem xét ngày sinh nhật
df = pd.DataFrame[{'date': ['3/10/2000', '3/11/2000', '3/12/2000'],3
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], dayfirst=True]
df
6. Cải thiện hiệu suất bằng cách đặt cột ngày làm chỉ mục
Một giải pháp phổ biến để chọn dữ liệu theo ngày là sử dụng maks boolean. Ví dụ
df = pd.DataFrame[{'date': ['3/10/2000', '3/11/2000', '3/12/2000'],4
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], dayfirst=True]
df
Giải pháp này thường yêu cầu ________ 191, ________ 192 và cột ngày ở định dạng ngày giờ. Và trên thực tế, giải pháp này chậm khi bạn thực hiện nhiều lựa chọn theo ngày trong một tập dữ liệu lớn
Nếu bạn định thực hiện nhiều lựa chọn theo ngày, thì sẽ nhanh hơn nếu đặt cột ngày làm chỉ mục trước để bạn tận dụng tối ưu hóa tích hợp sẵn của Pandas. Sau đó, bạn có thể chọn dữ liệu theo ngày bằng cách sử dụng
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',93. Hãy xem tập dữ liệu ví dụ city_sales. csv, có 1.795.144 hàng dữ liệu
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
df = pd.DataFrame[{'date': ['3/10/2000', '3/11/2000', '3/12/2000'],5
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], dayfirst=True]
df
Để đặt cột ngày làm chỉ mục
df = pd.DataFrame[{'date': ['3/10/2000', '3/11/2000', '3/12/2000'],6
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], dayfirst=True]
df
7. Chọn dữ liệu với một năm cụ thể và thực hiện tổng hợp
Giả sử chúng tôi muốn chọn tất cả dữ liệu trong năm 2018
df = pd.DataFrame[{'date': ['3/10/2000', '3/11/2000', '3/12/2000'],7
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], dayfirst=True]
df
Và để thực hiện tổng hợp trên vùng chọn chẳng hạn
Lấy tổng số năm 2018
df = pd.DataFrame[{'date': ['3/10/2000', '3/11/2000', '3/12/2000'],8
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], dayfirst=True]
df
Lấy tổng số cho mỗi thành phố vào năm 2018
df = pd.DataFrame[{'date': ['3/10/2000', '3/11/2000', '3/12/2000'],9
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], dayfirst=True]
df
8. Chọn dữ liệu với một tháng cụ thể và một ngày cụ thể trong tháng
Để chọn dữ liệu với một tháng cụ thể, ví dụ: tháng 5 năm 2018
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',0
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
Tương tự, để chọn dữ liệu có ngày cụ thể trong tháng, ví dụ 1st May 2018
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',1
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
9 Chọn dữ liệu giữa hai ngày
Để chọn dữ liệu giữa hai ngày, bạn có thể sử dụng
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',93 Ví dụ
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
Chọn dữ liệu giữa năm 2016 và 2018
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',2
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
Chọn dữ liệu trong khoảng thời gian từ 10 đến 11 giờ ngày 02/05/2018
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',3
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
Chọn dữ liệu giữa 10. 30 và 10. 45 vào ngày 2 tháng 5 năm 2018
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',4
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
Và để chọn dữ liệu giữa thời gian, chúng ta nên sử dụng
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',95, ví dụ: 10. 30 và 10. 45
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',510 Xử lý các giá trị bị thiếu
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
Chúng ta thường cần tính toán các số liệu thống kê về cửa sổ, chẳng hạn như giá trị trung bình luân phiên hoặc tổng luân phiên
Hãy tính tổng luân phiên trong 3 khoảng thời gian cửa sổ và sau đó xem xét 5 hàng trên cùng
df = pd.DataFrame[{'date': ['2016-6-10 20:30:0',6
'2016-7-1 19:45:30',
'2013-10-12 4:5:1'],
'value': [2, 3, 4]}]df['date'] = pd.to_datetime[df['date'], format="%Y-%d-%m %H:%M:%S"]
df
Chúng ta có thể thấy rằng nó chỉ bắt đầu có giá trị hợp lệ khi có 3 khoảng thời gian để nhìn lại. Một giải pháp để xử lý vấn đề này là chèn lấp dữ liệu