IlmHamroh
Data Science va sun'iy intellekt/Pandas12/14-dars17 daqiqa
Mundarija (22)

3.12-dars: Vaqt qatorlari (datetime)

3-QISM — PANDAS · 12-dars


1. Kirish va motivatsiya

Ko'p ma'lumot vaqtga bog'liq: kunlik savdo, oylik daromad, soatlik harorat, yillik o'sish. Bu — vaqt qatorlari (time series). Pandas vaqt bilan ishlashda juda kuchli: sanani tanish (to_datetime), sana qismlarini olish (yil, oy, kun, hafta kuni), vaqt bo'yicha guruhlash (resample — kunlikni oylikka), va vaqt bo'yicha siljitish (o'tgan oyga nisbatan o'sish). Vaqt qatori tahlilida savdo trendi, mavsumiylik, o'sish sur'ati ko'rinadi. Nega muhim? (1) Vaqtga bog'liq ma'lumot — savdo, moliya, sensor (juda keng); (2) Trend va mavsumiylik — vaqt bo'yicha naqsh; (3) Bashorat — vaqt qatori bashorati (kelajak). Bu dars vaqt qatorlarini o'rgatadi — vaqtga bog'liq ma'lumot tahlili.

Vaqt qatorlari (datetime) — vaqtga bog'liq ma'lumot: to_datetime (matn → sana), sana qismlari (.dt.year/.dt.month/.dt.day/.dt.dayofweek — yil/oy/kun/hafta), indeks (sana indeks — vaqt qatori), resample (vaqt bo'yicha guruh — kunlik→oylik), siljitish (shift — o'tgan davr, o'sish), oraliq (date_range — sanalar). Foydalanish: savdo trendi, mavsumiylik, vaqt tahlil. Bu 3.8 (groupby), 3.3 (o'qish — sana ustuni) bilan bog'liq. datetime — sana. resample — vaqt guruh. Trend.

Real vaziyat. Data Scientist kunlik savdo ma'lumoti bilan ishlar edi (sana, savdo — bir yil, 365 qator). Avval sanani tanidi: df["sana"] = pd.to_datetime(df["sana"]) (matn → sana; CSV — matn). Qismlar — df["oy"] = df["sana"].dt.month (oy), df["hafta_kuni"] = df["sana"].dt.dayofweek (hafta kuni — dam olish tahlili). resample (oylik jami) — df.set_index("sana")["savdo"].resample("ME").sum() (kunlik → oylik — 12 qiymat, trend). Siljitish (o'sish) — oylik.pct_change() (o'tgan oyga nisbatan o'sish %). Vaqt qatori trendni ochdi (yozda savdo yuqori — mavsumiylik; oylik o'sish). datetime/resample — vaqtga bog'liq tahlil (trend, mavsumiylik).

Bu darsda vaqt qatorlarini o'rganamiz.

Bu darsda:

  • to_datetime (sana tanish)
  • Sana qismlari (.dt)
  • Sana indeks va tanlash
  • resample (vaqt guruh)
  • shift va pct_change (o'sish)
  • Vaqt amaliyoti
  • Vaqt tuzoqlari
  • Amaliy: vaqt modeli

ℹ Misollar real pandas bilan (deterministik) ishlaydi.


2. Nazariya — chuqur tushuntirish

2.1. to_datetime (sana tanish)

Matn → sana:

python
import pandas as pd

# to_datetime — matn/son → sana
pd.to_datetime("2024-01-15")               # bitta sana
pd.to_datetime(["2024-01-01", "2024-02-01"])   # Series

df = pd.DataFrame({"sana": ["2024-01-01", "2024-01-02"]})
df["sana"] = pd.to_datetime(df["sana"])    # ustun → sana

# format berish (noaniq bo'lsa)
pd.to_datetime("15/01/2024", format="%d/%m/%Y")

to_datetime (sana tanish) — matn → sana: pd.to_datetime("2024-01-15") (bitta), pd.to_datetime(df["sana"]) (ustun → sana). Sabab: sana CSV'dan matn ("2024-01-01" — string, object; sana amallari yo'q); to_datetime sana turiga (datetime64 — sana amallari: qismlar, farq, guruh). format= (noaniq bo'lsa — "%d/%m/%Y" kun/oy/yil; Amerika %m/%d). Sana turi muhim (matn — tahlil yo'q; sana — .dt, resample). to_datetime — matn → sana (datetime64). Sana turi. Tanish.

2.2. Sana qismlari (.dt)

Yil, oy, kun:

python
df["sana"] = pd.to_datetime(df["sana"])

# .dt — sana qismlari (Series uchun)
df["sana"].dt.year        # yil (2024)
df["sana"].dt.month       # oy (1-12)
df["sana"].dt.day         # kun (1-31)
df["sana"].dt.dayofweek   # hafta kuni (0=Dush, 6=Yak)
df["sana"].dt.day_name()  # kun nomi ("Monday")
df["sana"].dt.quarter     # chorak (1-4)

Sana qismlari (.dt) — yil/oy/kun: df["sana"].dt.year (yil), .dt.month (oy 1-12), .dt.day (kun), .dt.dayofweek (hafta kuni — 0 Dushanba, 6 Yakshanba), .dt.day_name() (nom), .dt.quarter (chorak). Sabab: sanadan qismlar kerak (oy bo'yicha guruh — .dt.month; dam olish tahlili — .dt.dayofweek; chorak hisobot); .dt sana metodlari (Series — vektorlashtirilgan, har sana). .dt faqat sana turida (matn — xato; to_datetime avval). dayofweek (0-6 — dam olish 5,6). Sana qismlari — .dt.year/month/day (qismlar). Vektorlashtirilgan. Guruh uchun.

2.3. Sana indeks va tanlash

Sana indeks (vaqt qatori):

python
df["sana"] = pd.to_datetime(df["sana"])
df = df.set_index("sana")     # sana — indeks

# sana bo'yicha tanlash
df.loc["2024"]                # 2024 yil
df.loc["2024-01"]             # 2024 yanvar
df.loc["2024-01-01":"2024-01-31"]   # oraliq

df.sort_index()               # sana bo'yicha tartib

Sana indeks va tanlash — sana indeks: df.set_index("sana") (sana — indeks; vaqt qatori), keyin sana bo'yicha tanlash (df.loc["2024"] — yil; df.loc["2024-01"] — oy; df.loc["2024-01-01":"2024-01-31"] — oraliq). Sabab: vaqt qatorida sana indeks (tabiiy — vaqt bo'yicha tartib, tanlash); sana indeksda qulay tanlash (loc["2024"] — butun yil; qism-sana — avtomatik). set_index("sana") (sana indeks), sort_index (tartib — vaqt). Sana indeks resample uchun kerak 2.4-bob. Sana indeks — set_index (vaqt qatori), loc["2024"] tanlash. Indeks. Qulay.

2.4. resample (vaqt guruh)

Vaqt bo'yicha guruhlash:

python
# resample — vaqt bo'yicha guruh (sana indeks kerak)
df.set_index("sana")["savdo"].resample("ME").sum()   # oylik jami
df.set_index("sana")["savdo"].resample("W").mean()   # haftalik o'rtacha
df.set_index("sana")["savdo"].resample("YE").sum()   # yillik

# chastota: D (kun), W (hafta), ME (oy oxiri), QE (chorak), YE (yil)

resample (vaqt guruh) — vaqt bo'yicha guruhlash: df.resample("ME").sum() (oylik jami — kunlik → oylik), resample("W").mean() (haftalik o'rtacha), resample("YE").sum() (yillik). Sabab: vaqt qatori ko'pincha boshqa darajada kerak (kunlik savdo → oylik trend — 365 → 12; ko'rish oson); resample vaqt groupby (guruhlash — lekin vaqt bo'yicha; 3.8 kabi). Chastota: D (kun), W (hafta), ME (oy oxiri), QE (chorak), YE (yil). Sana indeks kerak (set_index). resample = groupby (vaqt bo'yicha). resample — vaqt guruh (kunlik→oylik). Chastota. Sana indeks.

2.5. shift va pct_change (o'sish)

Siljitish va o'sish:

python
oylik = df.resample("ME")["savdo"].sum()

# shift — qiymatni siljitish (o'tgan davr)
oylik.shift(1)             # bir oy oldingi qiymat

# farq (o'tgan oyga nisbatan)
oylik - oylik.shift(1)     # o'zgarish (miqdor)

# pct_change — foizli o'sish
oylik.pct_change()         # o'tgan oyga nisbatan o'sish (%)

shift va pct_change (o'sish) — siljitish va o'sish: shift(1) (qiymatni siljitish — bir davr oldingi; oylik.shift(1) — o'tgan oy qiymati), pct_change (foizli o'sish — o'tgan davrga nisbatan; oylik.pct_change() — oylik o'sish %). Sabab: vaqt qatorida o'zgarish/o'sish muhim (bu oy o'tganga nisbatan qancha o'sdi — trend); shift (oldingi qiymat — solishtirish), pct_change (foizli o'sish — (hozir - oldin)/oldin). O'sish sur'ati (moliya, savdo — trend). shift (siljitish), pct_change (foizli o'sish). shift/pct_change — o'sish (o'tgan davrga nisbatan). Trend. Sur'at.

2.6. Vaqt amaliyoti

Vaqt amaliyoti: to_datetime (matn → sana — birinchi qadam); .dt (qismlar — year/month/dayofweek); set_index (sana indeks — vaqt qatori); resample (vaqt guruh — kunlik→oylik); shift/pct_change (o'sish — trend); sort_index (vaqt tartibi); date_range (sanalar — pd.date_range("2024-01-01", periods=12, freq="ME")). Tuzoqlar: matn (.dt xato — to_datetime), format (noaniq — format=), sana indeks (resample kerak), chastota (D/W/ME — noto'g'ri), tartib (resample — sort_index). Amaliyot — to_datetime, .dt, resample, shift. Sana turi. Trend.

2.7. Vaqt tuzoqlari

Vaqt asosiy tuzoqlari: matn (sana emas) (CSV sana — matn (object); .dt/resample xato; pd.to_datetime avval; df.dtypes tekshir); format noaniq ("01/02/2024" — 1-fevral yoki 2-yanvar? mamlakat farqli; format= yoki dayfirst=); sana indeks yo'q (resample — sana indeks kerak; set_index("sana") avval; aks holda xato); chastota kodi ("M" eski — "ME" (oy oxiri) yangi; D/W/ME/YE; noto'g'ri kod xato); tartiblanmagan (vaqt qatori — sana tartibida bo'lishi kerak; sort_index; resample tartib talab); timezone (vaqt zonasi — murakkab; tz_localize/tz_convert; oddiy holda e'tiborsiz); NaT (Not a Time — sana NaN; to_datetime(errors="coerce") — xato → NaT); dayofweek (0 Dushanba, 6 Yakshanba — 0-6; 1 dan emas). Sabab: vaqt tur/indeks/format nozik (matn, chastota, indeks — jim xato). Yechim: to_datetime avval, sana indeks, chastota to'g'ri, sort_index. Tuzoqlar — matn, format, indeks, chastota.

2.8. Vaqt qatorlari — vaqtga bog'liq tahlil

Vaqt qatorlari asosiy g'oyasi — vaqtga bog'liq tahlil: ko'p ma'lumot vaqtga bog'liq (kunlik savdo, oylik daromad, soatlik harorat — time series); Pandas vaqt bilan kuchli (sana tanish, qismlar, resample, o'sish). to_datetime (matn → sana — datetime64, sana amallari), .dt (qismlar — yil/oy/hafta), sana indeks (set_index — vaqt qatori, loc tanlash), resample (vaqt guruh — kunlik→oylik, trend), shift/pct_change (o'sish — o'tgan davrga nisbatan). Vaqt qatori tahlili: trend (o'sish/pasayish), mavsumiylik (yoz savdo yuqori), o'sish sur'ati. Data Science'da keng (savdo, moliya, sensor, veb — vaqtga bog'liq; bashorat — 21-qism). Bu 3.8 (groupby — resample) davomi va vaqt qatori bashorati uchun asos. Vaqt qatorlari — vaqtga bog'liq tahlil (datetime, resample, trend). Time series. Trend/mavsumiylik.


3. Tez ma'lumotnoma

python
import pandas as pd

# to_datetime (matn → sana):
df["sana"] = pd.to_datetime(df["sana"])
pd.to_datetime("15/01/2024", format="%d/%m/%Y")   # format

# SANA QISMLARI (.dt):
df["sana"].dt.year        # yil
df["sana"].dt.month       # oy (1-12)
df["sana"].dt.dayofweek   # hafta kuni (0=Dush, 6=Yak)
df["sana"].dt.day_name()  # kun nomi

# SANA INDEKS va TANLASH:
df = df.set_index("sana")
df.loc["2024-01"]         # yanvar · df.loc["2024"] — yil

# resample (vaqt guruh — sana indeks kerak):
df["savdo"].resample("ME").sum()    # oylik jami
df["savdo"].resample("W").mean()    # haftalik o'rtacha
#   D (kun) W (hafta) ME (oy) QE (chorak) YE (yil)

# shift / pct_change (o'sish):
oylik.shift(1)            # o'tgan davr
oylik.pct_change()        # foizli o'sish

QOIDA: to_datetime avval · .dt qismlar · sana indeks (resample) · sort_index

Vaqt qatorlari xulosasi

Vaqt qatorlari — vaqtga bog'liq tahlil (trend, mavsumiylik)
to_datetime — matn → sana (datetime64, sana amallari)
.dt — sana qismlari (year/month/dayofweek)
resample — vaqt guruh (kunlik→oylik, sana indeks kerak)
shift/pct_change — o'sish (o'tgan davrga nisbatan)

4. Batafsil misollar

Misollar real pandas bilan (deterministik) ishlaydi.

Misol 1 — to_datetime va .dt

python
"""to_datetime va .dt (real pandas)."""

import pandas as pd


def main() -> None:
    df = pd.DataFrame({
        "sana": ["2024-01-15", "2024-06-20", "2024-12-25"],
        "savdo": [100, 200, 150],
    })

    print("=== 1. Boshlang'ich tur (matn) ===")
    print(f"  tur: {df['sana'].dtype}")

    print("\n=== 2. to_datetime ===")
    df["sana"] = pd.to_datetime(df["sana"])
    print(f"  yangi tur: {df['sana'].dtype}")

    print("\n=== 3. Qismlar (.dt) ===")
    print(f"  yillar: {list(df['sana'].dt.year)}")
    print(f"  oylar: {list(df['sana'].dt.month)}")

    print("\n=== 4. Hafta kuni ===")
    print(f"  hafta kunlari (0=Dush): {list(df['sana'].dt.dayofweek)}")
    print("  ⭐ to_datetime (sana) + .dt (qismlar)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Boshlang'ich tur (matn) ===
  tur: str

=== 2. to_datetime ===
  yangi tur: datetime64[us]

=== 3. Qismlar (.dt) ===
  yillar: [2024, 2024, 2024]
  oylar: [1, 6, 12]

=== 4. Hafta kuni ===
  hafta kunlari (0=Dush): [0, 3, 2]
  ⭐ to_datetime (sana) + .dt (qismlar)

Nima ko'rsatdi: 2.1, 2.2-bo'limlar.

Misol 2 — Sana indeks va tanlash

python
"""Sana indeks va tanlash (real pandas)."""

import pandas as pd


def main() -> None:
    df = pd.DataFrame({
        "sana": pd.to_datetime(["2024-01-05", "2024-01-20", "2024-02-10"]),
        "savdo": [100, 150, 200],
    })
    df = df.set_index("sana")

    print("=== 1. Sana indeks ===")
    print(f"  indeks turi: datetime")

    print("\n=== 2. Yanvar tanlash ===")
    yanvar = df.loc["2024-01"]
    print(f"  yanvar qatorlari: {len(yanvar)}")

    print("\n=== 3. Yanvar jami ===")
    print(f"  yanvar savdo: {yanvar['savdo'].sum()}")

    print("\n=== 4. Oraliq ===")
    oraliq = df.loc["2024-01-01":"2024-01-31"]
    print(f"  oraliq: {len(oraliq)} qator")
    print("  ⭐ Sana indeks — qulay tanlash (loc['2024-01'])")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Sana indeks ===
  indeks turi: datetime

=== 2. Yanvar tanlash ===
  yanvar qatorlari: 2

=== 3. Yanvar jami ===
  yanvar savdo: 250

=== 4. Oraliq ===
  oraliq: 2 qator
  ⭐ Sana indeks — qulay tanlash (loc['2024-01'])

Nima ko'rsatdi: 2.3-bo'lim.

Misol 3 — resample

python
"""resample: vaqt guruh (real pandas)."""

import pandas as pd


def main() -> None:
    sanalar = pd.date_range("2024-01-01", periods=90, freq="D")
    df = pd.DataFrame({"savdo": range(100, 190)}, index=sanalar)

    print("=== 1. Kunlik → oylik (sum) ===")
    oylik = df["savdo"].resample("ME").sum()
    print(f"  oylar soni: {len(oylik)} (3 oy)")

    print("\n=== 2. Oylik jami ===")
    print(f"  birinchi oy: {oylik.iloc[0]}")

    print("\n=== 3. Haftalik o'rtacha ===")
    haftalik = df["savdo"].resample("W").mean()
    print(f"  haftalar soni: {len(haftalik)}")

    print("\n=== 4. Tushuntirish ===")
    print("  resample — vaqt groupby (D→ME oylik)")
    print("  ⭐ resample — vaqt bo'yicha guruh")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Kunlik → oylik (sum) ===
  oylar soni: 3 (3 oy)

=== 2. Oylik jami ===
  birinchi oy: 3565

=== 3. Haftalik o'rtacha ===
  haftalar soni: 13

=== 4. Tushuntirish ===
  resample — vaqt groupby (D→ME oylik)
  ⭐ resample — vaqt bo'yicha guruh

Nima ko'rsatdi: 2.4-bo'lim.

Misol 4 — O'sish (pct_change)

python
"""O'sish: shift va pct_change (real pandas)."""

import pandas as pd


def main() -> None:
    oylik = pd.Series(
        [1000, 1200, 1100, 1500],
        index=pd.to_datetime(["2024-01-31", "2024-02-29", "2024-03-31", "2024-04-30"]),
    )

    print("=== 1. shift (o'tgan oy) ===")
    print(f"  o'tgan oy: {list(oylik.shift(1).fillna(0).astype(int))}")

    print("\n=== 2. Farq (miqdor) ===")
    farq = (oylik - oylik.shift(1)).fillna(0).astype(int)
    print(f"  o'zgarish: {list(farq)}")

    print("\n=== 3. pct_change (foiz) ===")
    osish = (oylik.pct_change() * 100).round(1)
    print(f"  o'sish %: {list(osish.fillna(0))}")

    print("\n=== 4. Eng ko'p o'sgan oy ===")
    print(f"  eng ko'p o'sish: {osish.max()}%")
    print("  ⭐ pct_change — foizli o'sish (trend)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. shift (o'tgan oy) ===
  o'tgan oy: [0, 1000, 1200, 1100]

=== 2. Farq (miqdor) ===
  o'zgarish: [0, 200, -100, 400]

=== 3. pct_change (foiz) ===
  o'sish %: [0.0, 20.0, -8.3, 36.4]

=== 4. Eng ko'p o'sgan oy ===
  eng ko'p o'sish: 36.4%
  ⭐ pct_change — foizli o'sish (trend)

Nima ko'rsatdi: 2.5-bo'lim.


5. To'g'ri va noto'g'ri tushunishlar

Noto'g'ri fikr To'g'risi
"sana matn OK" to_datetime (sana turi)
".dt matnda ishlaydi" Sana turi kerak
"resample indekssiz" Sana indeks kerak
"dayofweek 1 dan" 0 dan (0=Dush)
"format har doim aniq" Noaniq (dd/mm vs mm/dd)
"M oy chastotasi" ME (yangi kod)
"resample = groupby emas" Vaqt groupby
"shift keraksiz" O'sish (o'tgan davr)

6. Keng tarqalgan xatolar va yechimlari

1. Matn sana

python
df["sana"].dt.year   # matn bo'lsa xato                       # ⚠️
df["sana"] = pd.to_datetime(df["sana"])   # avval sana        # ✅

2. Format noaniq

python
pd.to_datetime("01/02/2024")   # 1-fev yoki 2-yan?           # ⚠️
pd.to_datetime("01/02/2024", format="%d/%m/%Y")   # aniq      # ✅

3. resample indeks

python
df["savdo"].resample("ME")   # sana indeks yo'q (xato)       # ⚠️
df.set_index("sana")["savdo"].resample("ME")   # indeks       # ✅

4. Chastota kodi

python
df.resample("M")   # eski kod (ogohlantirish)                # ⚠️
df.resample("ME")   # yangi (oy oxiri)                         # ✅

5. Tartiblanmagan

python
df.resample("ME")   # sana tartibsiz                          # ⚠️
df.sort_index().resample("ME")   # avval tartib               # ✅

6. NaT (sana NaN)

python
pd.to_datetime(df["sana"])   # xato sana → xato              # ⚠️
pd.to_datetime(df["sana"], errors="coerce")   # xato → NaT    # ✅

7. dayofweek

python
df["sana"].dt.dayofweek == 1   # Dushanba deb (aslida 0)     # ⚠️
df["sana"].dt.dayofweek == 0   # Dushanba (0 dan)             # ✅

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 3.8-dars (o'tilgan): groupby (resample — vaqt guruh)
  • 3.3-dars (o'tilgan): O'qish (sana ustuni)
  • 5-qism: Vizualizatsiya (vaqt qatori grafigi)
  • 21-qism: Vaqt qatori bashorati
  • 4-qism: Statistika (trend, mavsumiylik)

8. Eng yaxshi amaliyotlar

  1. to_datetime — avval (matn → sana).

  2. .dt — qismlar (sana turida).

  3. Sana indeks — set_index (resample kerak).

  4. resample — vaqt guruh (D/W/ME/YE).

  5. sort_index — vaqt tartibi.

  6. shift/pct_change — o'sish (trend).

  7. format=/errors — noaniq/xato sana.

  8. Vaqt qatorlari — vaqtga bog'liq tahlil.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # to_datetime nima?
2.  # nega sana turi?
3.  # .dt nima?
4.  # dayofweek nechadan?
5.  # sana indeks nima uchun?
6.  # resample nima?
7.  # resample = ?
8.  # chastota kodlari?
9.  # shift nima?
10. # pct_change nima?
11. # matn sana .dt?
12. # nega vaqt qatori muhim?
Javoblar
  1. Matn → sana
  2. Sana amallari (.dt, resample)
  3. Sana qismlari (year/month)
  4. 0 dan (0=Dush)
  5. Vaqt qatori (resample, tanlash)
  6. Vaqt bo'yicha guruh
  7. groupby (vaqt)
  8. D/W/ME/QE/YE
  9. Siljitish (o'tgan davr)
  10. Foizli o'sish
  11. Xato (to_datetime kerak)
  12. Vaqtga bog'liq (trend, mavsumiylik)

Vazifa 2: Xatolarni tuzating

python
1.  df["sana"].dt.year   # matn

2.  pd.to_datetime("01/02/2024")   # noaniq

3.  df["savdo"].resample("ME")   # indeks yo'q

4.  df.resample("M")   # eski kod

5.  df["sana"].dt.dayofweek == 1   # Dushanba
Javoblar
python
1.  pd.to_datetime(df["sana"]) avval

2.  format="%d/%m/%Y"

3.  df.set_index("sana")

4.  df.resample("ME")

5.  == 0   # 0=Dushanba

Vazifa 3: to_datetime

Modellang:

  1. Matn→sana
  2. Format
  3. Tur
  4. errors

Vazifa 4: .dt

Modellang:

  1. year
  2. month
  3. dayofweek
  4. Vektorlashtirilgan

Vazifa 5: resample

Modellang:

  1. Vaqt guruh
  2. Chastota
  3. Sana indeks
  4. Trend

Vazifa 6: O'sish

Modellang:

  1. shift
  2. pct_change
  3. O'tgan davr
  4. Foiz

Vazifa 7: O'ylash

resample aslida "vaqt bo'yicha groupby" — kunlik ma'lumotni oylikka guruhlaydi. Nima uchun vaqt uchun alohida resample bor (oddiy groupby o'rniga), va nega vaqt ma'lumoti (sana) boshqa ma'lumotdan (matn, son) "maxsus" — nega uni datetime turiga aylantirish shart?

Javob

Qisqa javob: resample — vaqt groupby, lekin alohida; sana maxsus tur, chunki: (1) vaqt uzluksiz/tartibli — sana tabiiy tartib (kun ketma-ket; matn/son — ixtiyoriy); vaqt oraliqlar (oy, hafta — teng bo'linmagan: 28-31 kun; groupby oddiy guruh — teng emas); resample vaqt mantiqi (oy oxiri, hafta boshi — kalendar biladi); (2) oraliq to'ldirish — vaqt qatorida bo'sh davrlar (savdo yo'q kun — resample 0 yoki NaN qo'yadi; groupby o'tkazib yuboradi); vaqt uzluksiz (har kun bo'lishi kerak — resample to'ldiradi); (3) vaqt amallari — shift (o'tgan davr), pct_change (o'sish), rolling (harakatlanuvchi o'rtacha) — vaqtga xos; oddiy guruhda yo'q. "Nega sana maxsus (datetime tur)": (a) tartib mantiqi — sana taqqoslanadi ("2024-01-01" < "2024-02-01" — sana; matnda ham lekin format bog'liq — "01/02" vs "02/01"); datetime aniq (tartib, farq); (b) qismlar — datetime'dan yil/oy/kun (.dt — matnda parse qilish kerak; datetime avtomatik); (c) farq/arifmetika — ikki sana farqi (kunlar — sana2 - sana1; matnda yo'q; datetime — timedelta); (d) kalendar — datetime kalendarni biladi (oyda nechta kun, kabisa yil, hafta kuni; matn bilmaydi); (e) resample/vaqt amallari — datetime kerak (matn — ishlamaydi). "Nega aylantirish shart": matn ("2024-01-01") — oddiy string (sana ma'nosi yo'q — taqqoslash format, qism yo'q, farq yo'q); to_datetime — sana ma'nosi (datetime64 — tartib, qism, farq, kalendar); vaqt tahlili datetime talab (.dt, resample, shift). Saboqlar: resample vaqt groupby (kalendar mantiqi — teng bo'linmagan oy; to'ldirish; vaqt amallari); sana maxsus (tartib, qism, farq, kalendar — datetime); aylantirish shart (matn — ma'no yo'q; datetime — sana amallari); vaqt uzluksiz (bo'sh to'ldirish). To'g'ri: to_datetime avval (matn → sana); resample (vaqt guruh — sana indeks). Muvozanat: umumiy (groupby — istalgan) + maxsus (resample — vaqt kalendar) — vaqt uchun resample (kalendar mantiqi). Bu vaqt qatori tabiati (uzluksiz, tartibli, kalendar — maxsus ishlov); datetime tur — vaqt "tili" (sana amallari). resample/datetime — vaqt uchun maxsus vosita (oddiy guruh yetmaydi).

1. Nega resample alohida

  • Vaqt tartibli/uzluksiz (kalendar — teng bo'linmagan oy)
  • Oraliq to'ldirish (bo'sh davr — 0/NaN)
  • Vaqt amallari (shift, pct_change, rolling)

2. Nega sana maxsus

  • Tartib mantiqi (taqqoslash — aniq)
  • Qismlar (.dt — yil/oy/kun)
  • Farq (kunlar — sana2-sana1)
  • Kalendar (oy kuni, kabisa, hafta)

3. Nega aylantirish shart

  • Matn — oddiy string (sana ma'nosi yo'q)
  • datetime — sana ma'nosi (tartib, qism, farq)
  • Vaqt tahlil datetime talab (.dt, resample)

4. Matn vs datetime

Matn datetime
String (ma'no yo'q) Sana (tartib, qism)
Taqqoslash format Aniq tartib
Qism yo'q .dt (yil/oy)

5. Saboqlar

  1. resample vaqt groupby (kalendar mantiqi)
  2. Sana maxsus (tartib, qism, farq, kalendar)
  3. Aylantirish shart (matn → datetime)
  4. Vaqt uzluksiz (to'ldirish)

6. Xulosa

  1. resample alohida (vaqt kalendar mantiqi)
  2. Sana maxsus (datetime — sana amallari)
  3. to_datetime shart (matn — ma'no yo'q)
  4. Vaqt uchun maxsus vosita (oddiy guruh yetmaydi)

Nimani mustahkamlaydi: 2.1, 2.4-bo'limlar.


Xulosa

Bu darsda vaqt qatorlarini o'rgandik.

Eng muhim uch fikr:

  1. to_datetime va .dt. to_datetime — matn → sana (pd.to_datetime(df["sana"]) — datetime64 turi; sana amallari ochiladi; format= noaniq bo'lsa); sana CSV'dan matn keladi (sana turiga aylantirish shart). Sana qismlari (.dt) — .dt.year (yil), .dt.month (oy 1-12), .dt.dayofweek (hafta kuni — 0 Dushanba, 6 Yakshanba), .dt.day_name(), .dt.quarter; vektorlashtirilgan (har sana).

  2. Sana indeks va resample. Sana indeks — df.set_index("sana") (vaqt qatori), sana bo'yicha tanlash (df.loc["2024-01"] — oy; df.loc["2024"] — yil; oraliq). resample — vaqt bo'yicha guruhlash (vaqt groupby): resample("ME").sum() (oylik jami — kunlik→oylik), resample("W").mean() (haftalik); chastota D/W/ME/QE/YE; sana indeks kerak.

  3. O'sish va trend. shift/pct_change — shift(1) (o'tgan davr qiymati), pct_change (foizli o'sish — o'tgan davrga nisbatan; trend). Vaqt qatorlari — vaqtga bog'liq tahlil (kunlik savdo, oylik daromad — trend, mavsumiylik, o'sish sur'ati); Data Science'da keng (savdo, moliya, sensor; bashorat — 21-qism). Sana maxsus tur (tartib, qism, farq, kalendar — datetime); resample vaqt uchun alohida (kalendar mantiqi — teng bo'linmagan oy, to'ldirish). Tuzoqlar: matn sana (to_datetime), format noaniq (format=), sana indeks (resample), chastota (ME), tartib (sort_index).

Keyingi darsda pivot va reshapeni o'rganamiz: ma'lumotni qayta shakllantirish (pivot_table, melt) — jadval ko'rinishini o'zgartirish (uzun ↔ keng).

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
3.12-dars: Vaqt qatorlari (datetime) — IlmHamroh