Để chuyển thành phần thời gian của DateTimeIndex về midnight (00:00:00) (giữ nguyên ngày), sử dụng phương thức DateTimeIndex.normalize().
Các bước thực hiện
1. Import thư viện
import pandas as pd
2. Tạo DateTimeIndex
Tần suất 10 giờ, 7 kỳ:
datetimeindex = pd.date_range('2021-10-30 02:30:50', periods=7, tz='Australia/Adelaide', freq='10H')
3. Chuẩn hóa về midnight
print("\nChuẩn hóa (chuyển về midnight):\n", datetimeindex.normalize())
Ví dụ hoàn chỉnh
import pandas as pd
datetimeindex = pd.date_range('2021-10-30 02:30:50', periods=7, tz='Australia/Adelaide', freq='10H')
print("DateTimeIndex:\n", datetimeindex)
print("\nTần suất:", datetimeindex.freq)
# Chuyển time component về 00:00:00
print("\nNormalize (midnight):\n", datetimeindex.normalize())
Kết quả đầu ra
DateTimeIndex: DatetimeIndex(['2021-10-30 02:30:50+10:30', '2021-10-30 12:30:50+10:30', '2021-10-30 22:30:50+10:30', '2021-10-31 08:30:50+10:30', '2021-10-31 18:30:50+10:30', '2021-11-01 04:30:50+10:30', '2021-11-01 14:30:50+10:30'], dtype='datetime64[ns, Australia/Adelaide]', freq='10H') Tần suất: <10 * Hours> Normalize (chuyển về midnight): DatetimeIndex(['2021-10-30 00:00:00+10:30', '2021-10-30 00:00:00+10:30', '2021-10-30 00:00:00+10:30', '2021-10-31 00:00:00+10:30', '2021-10-31 00:00:00+10:30', '2021-11-01 00:00:00+10:30', '2021-11-01 00:00:00+10:30'], dtype='datetime64[ns, Australia/Adelaide]', freq=None)
Giải thích
- 3 timestamp đầu (30/10) → cùng 1 ngày → normalize thành 30/10 00:00:00.
- 2 timestamp tiếp (31/10) → 31/10 00:00:00.
- 2 timestamp cuối (01/11) → 01/11 00:00:00.
- Kết quả có thể có trùng lặp (duplicate dates).
freq=Nonevì không còn tần suất đều.
So sánh normalize() vs floor('D')
# Giống nhau cho timezone-naive
dt.normalize() == dt.floor('D')
# Khác nhau cho timezone-aware (normalize giữ tz, floor có thể shift)
# normalize() an toàn hơn cho tz-aware
Ứng dụng
- Gom nhóm theo ngày:
df.groupby(df.index.normalize()).sum(). - So sánh ngày bỏ qua giờ.
- Chuẩn bị cho resample daily.