Genudtagning af tidsserier
Nedskalér daglige data til månedlige data med resample('ME').sum(), og opskalér med fremadrettet udfyldning for at udfylde manglende intervaller.
Genudtagning af tidsserier er en gratis Pandas & NumPy Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Pandas & NumPy Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Pandas & NumPy Academy-kurset indeholder 4 lektioner i alt.
Hvad er resampling?
Resampling ændrer frekvensen i en tidsserie. Nedskalering reducerer frekvensen — f.eks. ved at konvertere daglige data til månedlige totaler. Opskalering øger frekvensen — f.eks. ved at konvertere månedlige data til daglige data og udfylde huller med interpolerede værdier. Begge operationer kræver en DatetimeIndex og udføres med metoden resample(), som er Pandas' tidsbevidste version af groupby().
Metoden resample()
df.resample(rule) opretter et DatetimeIndexResampler-objekt, hvor rule er et frekvensalias for en forskydning. Ligesom med groupby() beregnes der ikke noget, før du kæder en aggregeringsmetode på. Almindelige regler er: 'D' (dag), 'W' (uge), 'ME' (månedsafslutning), 'QE' (kvartalsafslutning) og 'YE' (årsafslutning). DataFrame skal have en DatetimeIndex.
import pandas as pd
import numpy as np
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=90, freq='D')
df = pd.DataFrame({'sales': np.random.randint(100, 500, 90)}, index=dates)
print(df.head())
print('Shape:', df.shape) # (90, 1) -- 90 daily rowsNedskalering: dagligt til månedligt
Hvis du vil nedskalere daglige data til månedlige data, skal du kalde resample('ME') og kæde en aggregering på. sum() giver månedlige totaler, mean() giver månedlige gennemsnit, og last() giver den sidste værdi i hver periode. Resultatet har én række pr. periode med periodens slutdato som indeksmærkat.
# Monthly totals
monthly_sum = df.resample('ME').sum()
print(monthly_sum)
# sales
# 2024-01-31 9876
# 2024-02-29 8765
# 2024-03-31 9234
# Monthly averages
monthly_mean = df.resample('ME').mean().round(1)
print(monthly_mean)Nedskalering til ugentlige data
Brug 'W' til resampling efter kalenderuge, der slutter søndag. Brug 'W-MON', hvis du vil have uger, der slutter mandag. Pandas grupperer alle datoer i hver uge og anvender aggregeringen. Det er nyttigt til ugentlig rapportering, hvor du vil have én opsummeringsrække pr. uge.
# Weekly sum
weekly = df.resample('W').sum()
print(weekly.head())
# sales
# 2024-01-07 2010 <- Jan 1-7
# 2024-01-14 2340 <- Jan 8-14
# ...
# Weekly max and count using agg()
weekly_stats = df.resample('W').agg(['sum', 'mean', 'max'])
print(weekly_stats.head())Anvendelse af flere aggregeringer
Ligesom med groupby() kan du kæde .agg() på et resampler-objekt for at beregne flere statistikker i én gennemløb. Angiv en liste med funktionsnavne eller en ordbog til navngivne aggregeringer. Dette er den mest effektive måde at opbygge en omfattende opsummeringstabel for tidsserier på.
monthly_stats = df.resample('ME').agg(
total_sales=('sales', 'sum'),
avg_sales=('sales', 'mean'),
peak_sales=('sales', 'max'),
days_counted=('sales', 'count')
)
print(monthly_stats.round(1))
# total_sales avg_sales peak_sales days_counted
# 2024-01-31 9876 318.6 499 31OHLC-resampling til finansielle data
Til finansielle tidsserier resampler metoden .ohlc() data til værdierne Open, High, Low og Close (OHLC) pr. periode — den almindelige repræsentation i et lysestagediagram. Dette giver kun mening for numeriske data, der repræsenterer en pris eller et niveau. Hver kolonne i inputtet får fire OHLC-kolonner i outputtet.
# OHLC monthly resampling
ohlc = df['sales'].resample('ME').ohlc()
print(ohlc)
# open high low close
# 2024-01-31 365 499 101 243
# 2024-02-29 ...Opskalering: månedligt til dagligt
Opskalering øger frekvensen, hvilket opretter rækker for tidsstempler, der ikke fandtes i de oprindelige data. Disse nye rækker indeholder oprindeligt NaN. Derefter udfylder du dem med en metode, der passer til dine data: ffill() (fremadrettet udfyldning — før den senest kendte værdi videre) eller bfill() (bagudrettet udfyldning — brug den næste kendte værdi), eller interpolate() til jævn interpolation.
# Monthly data
monthly = pd.Series(
[100, 120, 115],
index=pd.date_range('2024-01-31', periods=3, freq='ME')
)
print(monthly)
# Upsample to daily (creates NaN rows)
daily = monthly.resample('D').asfreq()
print(daily.head(10))
# 2024-01-31 100.0
# 2024-02-01 NaN <- new row
# ...Udfyldning af huller efter opskalering
Efter opskalering skal du udfylde hullerne med NaN, som blev oprettet for de nye tidsstempler. ffill() viderefører den senest kendte værdi indtil den næste reelle observation — det er velegnet til priser, hvor den senest handlede pris fortsat er gyldig. interpolate(method='linear') udfylder med lineært fordelte værdier mellem observationerne — det er velegnet til jævne, kontinuerte variabler.
# Forward fill: carry monthly value forward to every day
daily_ffill = monthly.resample('D').ffill()
print(daily_ffill.head(35))
# 2024-01-31 100
# 2024-02-01 100 <- forward filled
# ...
# 2024-02-29 120 <- new month value
# Linear interpolation
daily_interp = monthly.resample('D').interpolate(method='linear')
print(daily_interp.head(10))Resampling inden for grupper
Du kan kombinere groupby() og resample() for at udføre resampling separat inden for hver gruppe. Kald groupby(column).resample(rule) på en DataFrame med en DatetimeIndex. Dette giver et resultat med et MultiIndex, hvor det ydre niveau er gruppenøglen, og det indre niveau er den resamplede tidsperiode — meget nyttigt til tidsserieanalyse på produkt- eller regionsniveau.
df2 = pd.DataFrame({
'product': ['A', 'B', 'A', 'B', 'A', 'B'],
'sales': [100, 150, 120, 130, 110, 160]
}, index=pd.date_range('2024-01-01', periods=6, freq='ME'))
# Monthly sum per product
result = df2.groupby('product').resample('QE').sum()
print(result)Forankring med brugerdefinerede forskydninger
Som standard forankrer 'ME' sig på kalenderens månedsafslutningsdatoer. Til ikke-standardiserede regnskabsperioder kan du bruge forskydninger som 'QS-APR' (kvartal, der starter i april) eller 'YS-OCT' (år, der starter i oktober). Pandas understøtter mange forankrede aliaser for forskydninger. Se Pandas-dokumentationen for den komplette liste, når du arbejder med regnskabsperioder, der ikke følger kalenderåret.
# Fiscal year starting in April
fiscal_annual = df.resample('YE-MAR').sum()
print(fiscal_annual)
# sales
# 2024-03-31 XXXX <- April 2023 to March 2024
# Quarter starting in April
fiscal_q = df.resample('QE-MAR').mean().round(0)
print(fiscal_q)Kontrol af integriteten af resamplingresultatet
Efter resampling skal du altid kontrollere, at resultatet giver mening. Kontrollér, at antallet af outputperioder svarer til forventningerne, at ingen perioder mangler (se efter NaN i outputtet), og at summen af de månedlige totaler svarer til summen af de oprindelige daglige data, når du nedskalerer med sum(). Disse rimelighedstjek afslører fejl med forskydning på én i frekvensstrenge og manglende datointervaller.
monthly = df.resample('ME').sum()
# Verify: monthly totals should sum to daily total
assert monthly['sales'].sum() == df['sales'].sum(), 'Sum mismatch!'
# Verify: expected number of months
print('Months:', len(monthly)) # should be 3 for 90 days Jan-Mar
# Check for any NaN
print('NaN count:', monthly.isna().sum().sum())Hurtigt tjek
Test din forståelse af resampling af tidsserier fra denne lektion.
Opsummering af lektionen
I denne lektion lærte du, at resample() er den tidsbevidste pendant til groupby() til ændring af frekvensen i tidsserier; at nedskalering aggregerer data (dagligt til månedligt med sum/gennemsnit); at opskalering opretter nye tidsstempler, der skal udfyldes med ffill() eller interpolate(); og at du kan kombinere groupby() med resample() til tidsaggregering på gruppeniveau. I næste lektion undersøger vi forskydning og forsinkelsesvariabler.
Lær Python med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 30
- Lektioner
- 120
Ofte stillede spørgsmål
Er lektionen “Genudtagning af tidsserier” gratis?
Ja — hele teksten til “Genudtagning af tidsserier” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Pandas & NumPy Academy-kurset, skal du opgradere til CoddyKit PRO. Pandas & NumPy Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Genudtagning af tidsserier”?
Nedskalér daglige data til månedlige data med resample('ME').sum(), og opskalér med fremadrettet udfyldning for at udfylde manglende intervaller. Du øver dig i Pandas & NumPy Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Pandas & NumPy Academy?
Der kræves ingen tidligere erfaring. Pandas & NumPy Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Genudtagning af tidsserier”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Pandas & NumPy Academy-lektion?
Ja. Alle Pandas & NumPy Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- DatetimeIndex og periodeintervaller
- Genudtagning af tidsserier
- Forskydning og lagfunktioner
- Udtræk af tidsmæssige funktioner