Riješeno: pandas Timedelta do postgresa

Posljednje ažuriranje: 09/11/2023

U svijetu analize podataka, rukovanje podacima vremenskih serija je ključni aspekt. Jedna od najčešće korišćenih biblioteka za ovu svrhu je **pandas** u programskom jeziku Python. Uobičajeni zadatak pri radu s podacima vremenskih serija je pretvaranje vremenskih razlika između različitih događaja u standardni format. Ovdje pande Timedelta dobro dolaze. Međutim, kada radite sa bazama podataka kao što je PostgreSQL, pohranjivanje ovih timedelta može biti malo nezgodno. U ovom članku ćemo razgovarati o tome kako pretvoriti pande Timedelta u format koji se može pohraniti u PostgreSQL i vratiti ga uz održavanje ispravnog prikaza.

Rješenje problema

Rješenje ovog problema uključuje korištenje pandas i psycopg2 biblioteka, koje se naširoko koriste za manipulaciju podacima i PostgreSQL upravljanje bazom podataka. Biblioteka psycopg2 ima podršku za rukovanje timedeltas, koristeći tip podataka `interval` u PostgreSQL-u. Iskoristit ćemo ovu funkciju da pohranimo naše pande Timedelta u PostgreSQL i vratimo je u odgovarajućem formatu.

Prvo, uvezimo potrebne biblioteke i uspostavimo vezu sa našom PostgreSQL bazom podataka.

import pandas as pd
import psycopg2

conn = psycopg2.connect(database="your_database",
                        user="your_user",
                        password="your_password",
                        host="your_host",
                        port="your_port")

pandas Timedelta i PostgreSQL Interval

pandas Timedelta je moćan alat za izražavanje vremenskih razlika na dosljedan i čitljiv način. Lako je kreirati i manipulirati timedelta objektima u pandama, ali kada je u pitanju njihovo pohranjivanje u PostgreSQL bazu podataka, moramo ih konvertirati u odgovarajući format.

PostgreSQL nudi tip podataka `interval` za pohranjivanje vremenskih intervala. Ovaj tip podataka može predstavljati vremenski raspon u različitim granularnostima, kao što su dani, sati, minute i sekunde. Da bismo pohranili pandu Timedeltu u PostgreSQL bazu podataka, moramo je pretvoriti u PostgreSQL interval.

Kreirajmo uzorak pandas DataFrame sa Timedelta kolonom:

data = {'event_name': ['start', 'end'],
        'time': [pd.Timestamp('2021-01-01'), pd.Timestamp('2021-01-03')]}
df = pd.DataFrame(data)
df['difference'] = df['time'].diff()
print(df)

Sada napravimo funkciju za umetanje ovih podataka u našu PostgreSQL bazu podataka i pretvaranje Timedelta podataka u interval kompatibilan sa PostgreSQL.

def insert_data(event_name, time, difference, conn):
    query = """
    INSERT INTO timedeltas (event_name, time, difference)
    VALUES (%s, %s, %s)
    """
    with conn.cursor() as cur:
        cur.execute(query, (event_name, time, difference))
    conn.commit()

Koristeći ovu funkciju, možemo umetnuti naše pandas DataFrame podatke u PostgreSQL bazu podataka:

for _, row in df.iterrows():
    event_name, time, difference = row['event_name'], row['time'], row['difference']
    insert_data(event_name, time, difference, conn)

Preuzimanje Timedeltas iz PostgreSQL-a

Kada se pandas Timedelta podaci pohrane u PostgreSQL kao intervali, možemo ih lako dohvatiti i pretvoriti natrag u pandas Timedeltas dok čitamo podatke.

Kreirajmo funkciju za preuzimanje podataka iz naše PostgreSQL tablice:

def fetch_data(conn):
    query = "SELECT event_name, time, difference FROM timedeltas"
    data = pd.read_sql(query, conn)
    data['difference'] = pd.to_timedelta(data['difference'])
    return data

Pomoću ove funkcije možemo dohvatiti i ispisati podatke iz naše PostgreSQL baze podataka:

result = fetch_data(conn)
print(result)

Podaci koji se preuzimaju iz PostgreSQL-a sada imaju svoje Timedelte pravilno predstavljene kao pande Timedeltas.

U zaključku, pretvaranje pandas Timedelta u format pogodan za PostgreSQL skladištenje i njegovo preuzimanje u originalnom obliku je jednostavan proces. Koristeći moćne pande i psycopg2 biblioteke, možemo lako upravljati podacima vremenskih serija i održavati njihovu ispravnu reprezentaciju, kako u našoj analizi podataka tako iu našoj bazi podataka.

Slični postovi: