DatetimeIndex i zakresy okresów
Twórz DatetimeIndex za pomocą pd.date_range, analizuj tekstowe daty i ustawiaj kolumnę czasu jako indeks, aby korzystać z dostępu zależnego od czasu.
DatetimeIndex i zakresy okresów to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Dlaczego Pandas ma specjalne narzędzia do obsługi czasu
Dane szeregów czasowych wymagają czegoś więcej niż tylko przechowywania dat jako ciągów znaków. Trzeba je sortować według czasu, wybierać zakresy dat, zmieniać częstotliwość próbkowania oraz wyodrębniać elementy, takie jak miesiąc i dzień tygodnia. Pandas umożliwia to za pomocą DatetimeIndex — indeksu złożonego z wartości datetime64 — który udostępnia wyspecjalizowane operacje uwzględniające czas, niedostępne dla zwykłych indeksów całkowitych ani tekstowych.
Tworzenie DatetimeIndex za pomocą pd.date_range()
pd.date_range(start, end, freq) generuje sekwencję dat rozmieszczonych w równych odstępach. Parametr freq określa interwał za pomocą aliasów przesunięć: 'D' oznacza dzień, 'h' godzinę, 'ME' koniec miesiąca, 'W' tydzień, a 'YE' koniec roku. Można przekazać parametr end albo periods (liczbę znaczników czasu) — nie oba jednocześnie.
import pandas as pd
# Daily dates for January 2024
dates = pd.date_range(start='2024-01-01', end='2024-01-07', freq='D')
print(dates)
# DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03',
# '2024-01-04', '2024-01-05', '2024-01-06', '2024-01-07'],
# dtype='datetime64[ns]', freq='D')
# 12 month-end dates
months = pd.date_range(start='2024-01-31', periods=12, freq='ME')
print(months[:3])Ustawianie DatetimeIndex w DataFrame
Aby włączyć operacje oparte na czasie, ustaw kolumnę z datami jako indeks DataFrame za pomocą set_index(), po wcześniejszej konwersji do typu datetime64 funkcją pd.to_datetime(). Gdy indeks jest typu DatetimeIndex, można używać indeksowania częściowymi ciągami znaków (df['2024-01']), wycinania zakresów dat oraz wszystkich metod uwzględniających czas.
df = pd.DataFrame({
'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
'value': [10, 15, 12]
})
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
print(df)
# value
# date
# 2024-01-01 10
# 2024-01-02 15
# 2024-01-03 12
print(type(df.index)) # DatetimeIndexIndeksowanie częściowymi ciągami znaków
Jedną z najwygodniejszych funkcji DatetimeIndex jest indeksowanie częściowymi ciągami znaków. Można wybierać wiersze według roku, miesiąca lub daty, przekazując częściowy ciąg daty do .loc[]. Na przykład df.loc['2024-01'] zwraca wszystkie wiersze ze stycznia 2024 roku, a df.loc['2024'] zwraca wszystkie wiersze z 2024 roku. Nie trzeba jawnie porównywać wartości kolumn.
# Create a larger date-indexed Series
s = pd.Series(
range(365),
index=pd.date_range('2024-01-01', periods=365, freq='D')
)
# Select all of January 2024
print(s.loc['2024-01'].shape) # (31,)
# Select a specific date range
print(s.loc['2024-03-01':'2024-03-07'])pd.to_datetime() do analizowania dat
pd.to_datetime() konwertuje ciągi znaków, liczby całkowite (znaczniki czasu Unix) lub kolumny dat w mieszanych formatach do typu datetime64. Przekaż parametr format, aby określić dokładny wzorzec, jeśli daty mają niestandardowy format (np. '%d/%m/%Y'). Użyj errors='coerce', aby nieparsowalne wartości zostały przekonwertowane na NaT (Not a Time), zamiast powodować błąd.
# Parse standard ISO format
print(pd.to_datetime('2024-06-15'))
# Parse non-standard format
print(pd.to_datetime('15/06/2024', format='%d/%m/%Y'))
# Handle mixed/bad data gracefully
mixed = pd.to_datetime(['2024-01-01', 'bad_date', '2024-06-15'],
errors='coerce')
print(mixed) # NaT for 'bad_date'Akcesor .dt do elementów daty i czasu
Gdy kolumna DataFrame (a nie indeks) zawiera wartości datetime64, akcesor .dt udostępnia wszystkie właściwości i metody daty i czasu dla całego wektora. Można za jego pomocą bez używania pętli wyodrębniać między innymi .dt.year, .dt.month, .dt.day, .dt.day_of_week i .dt.hour. Jeśli data i czas znajdują się w indeksie, użyj bezpośrednio df.index.year.
df_col = pd.DataFrame({'date': pd.date_range('2024-01-01', periods=5, freq='D'),
'value': [10, 15, 12, 18, 14]})
df_col['year'] = df_col['date'].dt.year
df_col['month'] = df_col['date'].dt.month
df_col['dow'] = df_col['date'].dt.day_of_week # 0=Monday
df_col['week'] = df_col['date'].dt.isocalendar().week
print(df_col.head())Zakresy okresów za pomocą pd.period_range()
PeriodIndex reprezentuje przedziały czasu, a nie konkretne znaczniki czasu. pd.period_range(start, periods, freq) tworzy okresy miesięczne, kwartalne lub roczne. Okres taki jak Period('2024-01', 'M') reprezentuje cały styczeń 2024 roku, a nie tylko jego pierwszy dzień. PeriodIndex jest przydatny w raportowaniu finansowym, gdzie operuje się kwartałami lub miesiącami.
# Monthly periods
periods = pd.period_range('2024-01', periods=6, freq='M')
print(periods)
# PeriodIndex(['2024-01', '2024-02', '2024-03',
# '2024-04', '2024-05', '2024-06'],
# dtype='period[M]')
# Quarterly periods
quarters = pd.period_range('2024Q1', periods=4, freq='Q')
print(quarters) # [2024Q1, 2024Q2, 2024Q3, 2024Q4]Konwertowanie między Timestamp i Period
DatetimeIndex można przekonwertować na PeriodIndex za pomocą to_period(freq), a następnie z powrotem za pomocą to_timestamp(). Konwersja na okresy jest przydatna, gdy wiersze mają być oznaczane miesiącem lub kwartałem, a nie konkretnym dniem. Dzięki temu grupowanie i agregowanie jest bardziej intuicyjne w analizie opartej na kalendarzu.
daily_idx = pd.date_range('2024-01-15', periods=5, freq='D')
print('DatetimeIndex:', daily_idx[:3])
# Convert to monthly periods
monthly_idx = daily_idx.to_period('M')
print('PeriodIndex:', monthly_idx[:3])
# PeriodIndex(['2024-01', '2024-01', ...], dtype='period[M]')
# Convert back to timestamps (start of period)
print(monthly_idx.to_timestamp()[:3])Obsługa stref czasowych
Rzeczywiste szeregi czasowe często zawierają informacje o strefie czasowej. Pandas obsługuje DatetimeIndex ze strefą czasową za pomocą tz_localize() (dołączanie strefy czasowej do naiwnych znaczników czasu) i tz_convert() (konwertowanie między strefami czasowymi). Zawsze wykonuj wewnętrzne operacje w UTC, a na czas lokalny konwertuj dopiero na potrzeby wyświetlania, aby uniknąć błędów wynikających z niejednoznaczności związanej ze zmianą czasu na letni.
naive = pd.date_range('2024-01-01', periods=3, freq='D')
print('Naive:', naive.tz)
# Attach timezone (localize)
utc = naive.tz_localize('UTC')
print('UTC:', utc)
# Convert to New York time
ny = utc.tz_convert('America/New_York')
print('NY:', ny[:2])Sprawdzanie i sortowanie DatetimeIndex
Operacje na szeregach czasowych, takie jak zmiana częstotliwości próbkowania i wycinanie, wymagają posortowanego DatetimeIndex (monotonicznie rosnącego). Sprawdź go za pomocą df.index.is_monotonic_increasing, a w razie potrzeby posortuj za pomocą df.sort_index(). Nieposortowany DatetimeIndex może powodować trudne do wykrycia błędy lub nieoczekiwane wyniki podczas zmiany częstotliwości próbkowania i korzystania z funkcji okienkowych.
import numpy as np
df_unsorted = pd.DataFrame(
{'value': [10, 15, 12]},
index=pd.to_datetime(['2024-01-03', '2024-01-01', '2024-01-02'])
)
print('Sorted:', df_unsorted.index.is_monotonic_increasing) # False
df_sorted = df_unsorted.sort_index()
print('After sort:', df_sorted.index.is_monotonic_increasing) # True
print(df_sorted)Praktyczny schemat: tworzenie DataFrame szeregu czasowego
Oto kompletny schemat tworzenia indeksowanego czasowo DataFrame z surowych danych: przeanalizuj daty, ustaw indeks, posortuj dane i sprawdź częstotliwość indeksu. Taka konfiguracja jest podstawą całej analizy szeregów czasowych w kolejnych lekcjach — zmiana częstotliwości próbkowania, średnie kroczące i cechy opóźnione wymagają poprawnego, posortowanego DatetimeIndex.
import numpy as np
# Simulate loading raw data
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=30, freq='D')
df_ts = pd.DataFrame({'sales': np.random.randint(100, 500, 30)}, index=dates)
df_ts.index.name = 'date'
print('Shape:', df_ts.shape)
print('Freq:', df_ts.index.freq)
print('Sorted:', df_ts.index.is_monotonic_increasing)
print(df_ts.head())Szybki test
Sprawdź swoją znajomość DatetimeIndex i zakresów okresów z tej lekcji.
Podsumowanie lekcji
W tej lekcji dowiedziałeś się, jak tworzyć DatetimeIndex za pomocą pd.date_range() i analizować daty za pomocą pd.to_datetime(), jak używać indeksowania częściowymi ciągami znaków do intuicyjnego wybierania dat, jaka jest różnica między typami Timestamp i Period oraz jak obsługiwać strefy czasowe. Następnie zajmiemy się zmianą częstotliwości próbkowania w celu zmiany częstotliwości szeregu czasowego.
Często zadawane pytania
Czy lekcja „DatetimeIndex i zakresy okresów” jest bezpłatna?
Tak — pełny tekst „DatetimeIndex i zakresy okresów” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „DatetimeIndex i zakresy okresów”?
Twórz DatetimeIndex za pomocą pd.date_range, analizuj tekstowe daty i ustawiaj kolumnę czasu jako indeks, aby korzystać z dostępu zależnego od czasu. Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?
Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „DatetimeIndex i zakresy okresów”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?
Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- DatetimeIndex i zakresy okresów
- Resampling szeregów czasowych
- Przesuwanie i cechy opóźnione
- Wyodrębnianie cech czasowych