Aikatiedon lukeminen merkkijonosta

Merkkijonona (tekstinä) esitetyt aikatiedot pitää muuntaa Pythonin ymmärtämiksi aikatiedoiksi. Tämän voin tehdä esimerkiksi seuraavilla tavoilla:

Tapa 1:

  • Avaan datan ja katson, missä muodossa aikatiedot ovat?
  • Muunnan aikatiedot pandas-kirjaston to_datetime-funktiolla ja sijoitan ne indeksiin.

Tapa 2:

  • Muunnan aikatiedot strptime-funktiolla.
  • Sijoitan aikatiedot jo avaamisen yhteydessä indeksiin.

Muuntamisessa tarvitsen muotoilukoodeja, jotka löydän esimerkiksi osoitteesta: https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior

In [1]:
import pandas as pd
import numpy as np

Tapa 1

In [7]:
# Avaan aikasarjatietoa sisältävän tiedoston
# ja katson aikatiedon esitysmuodon
df1 = pd.read_excel('http://taanila.fi/CO2.xlsx')
df1.head()
Out[7]:
Kuukausi CO2
0 1999-12 368.04
1 2000-1 369.25
2 2000-2 369.50
3 2000-3 370.56
4 2000-4 371.82
In [8]:
# Sijoitan aikatiedon indeksiin
# to_datetime-funktio muuntaa merkkijonot aikatiedoiksi 
df1.index = pd.to_datetime(df1['Kuukausi'], format='%Y-%m')
df1 = df1.drop('Kuukausi', axis=1)
df1.head()
Out[8]:
CO2
Kuukausi
1999-12-01 368.04
2000-01-01 369.25
2000-02-01 369.50
2000-03-01 370.56
2000-04-01 371.82

Tapa 2

In [9]:
# Funktio, joka muuntaa merkkijonon aikatiedoiksi
def parser(x):
    return pd.datetime.strptime(x, '%Y-%m')

# Datan avaamisen yhteydessä sijoitan aikatiedot indeksiin
df2 = pd.read_excel('CO2.xlsx', index_col=0, date_parser=parser)
df2.head()
Out[9]:
CO2
Kuukausi
1999-12 368.04
2000-1 369.25
2000-2 369.50
2000-3 370.56
2000-4 371.82

Tapa 1

In [10]:
# Avaan aikasarjatietoa sisältävän tiedoston
# ja katson aikatiedon esitysmuodon
df3 = pd.read_csv('http://taanila.fi/Electric_Production.csv')
df3.head()
Out[10]:
DATE IPG2211A2N
0 1/1/1985 72.5052
1 2/1/1985 70.6720
2 3/1/1985 62.4502
3 4/1/1985 57.4714
4 5/1/1985 55.3151
In [11]:
# Sijoitan aikatiedon indeksiin
# to_datetime-funktio muuntaa merkkijonot aikatiedoiksi 
df3.index = pd.to_datetime(df3['DATE'], format='%m/%d/%Y')
df3 = df3.drop('DATE', axis=1)
df3.head()
Out[11]:
IPG2211A2N
DATE
1985-01-01 72.5052
1985-02-01 70.6720
1985-03-01 62.4502
1985-04-01 57.4714
1985-05-01 55.3151

Tapa 2

In [12]:
# Funktio, joka muuntaa merkkijonon aikatiedoiksi
def parser(x):
    return pd.datetime.strptime(x,'%m/%d/%Y')

# Datan avaamisen yhteydessä sijoitan aikatiedot indeksiin
df4 = pd.read_csv('http://taanila.fi/Electric_Production.csv',
                 index_col=0, date_parser=parser)
df4.head()
Out[12]:
IPG2211A2N
DATE
1985-01-01 72.5052
1985-02-01 70.6720
1985-03-01 62.4502
1985-04-01 57.4714
1985-05-01 55.3151

Aikatietojen luominen

Voin luoda sarjan aikatietoja pandas-kirjaston date_range-funktiolla. Funktiolle annan parametreina täsmälleen kolme seuraavista: start, end, periods, freq. Lue lisää:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.date_range.html

freq-parametrin mahdolliset arvot löydät seuraavasta:

https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases

In [19]:
# Aikasarjan luvut
series = [500,350,250,400,450,350,200,300,350,200,150,400,550,
        350,250,550,550,400,350,600,750,500,400,650,850]

# Aikatietojen luominen vuosineljänneksittäin (Q)
index = pd.date_range(start='2013-03-31', periods=len(series), freq='Q')

# Dataframen luominen
df5 = pd.DataFrame(series, index=index)

# Otsikko aikasarjan luvuille
df5.columns=['Demand']
df5
Out[19]:
Demand
2013-03-31 500
2013-06-30 350
2013-09-30 250
2013-12-31 400
2014-03-31 450
2014-06-30 350
2014-09-30 200
2014-12-31 300
2015-03-31 350
2015-06-30 200
2015-09-30 150
2015-12-31 400
2016-03-31 550
2016-06-30 350
2016-09-30 250
2016-12-31 550
2017-03-31 550
2017-06-30 400
2017-09-30 350
2017-12-31 600
2018-03-31 750
2018-06-30 500
2018-09-30 400
2018-12-31 650
2019-03-31 850