Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Python Pandas - Chuyển thời gian DateTimeIndex về midnight (00:00:00)

Để 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=None vì 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.