Aikaleimat

Monista palveluista (esimerkiksi Yahoo Finance) voit noutaa aikasarjoja, joissa aikaleimat tulevat automaattisesti dataframen indeksiin. Jos näin ei ole, niin joudun itse huolehtimaan aikaleimojen muuntamisesta ja siirtämisestä indeksiin.

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

Esimerkki 1 - tapa 1

In [2]:
# Avaan aikasarjatietoa sisältävän tiedoston ja katson aikatiedon esitysmuodon
df1 = pd.read_excel('http://taanila.fi/CO2.xlsx')
df1.head()
Out[2]:
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 [3]:
# 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[3]:
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

Esimerkki 1 - tapa 2

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

# Datan avaamisen yhteydessä sijoitan aikatiedot indeksiin
# index_col = 0 tarkoittaa, että datan ensimmäisestä sarakkeesta tehdään indeksi
df2 = pd.read_excel('https://taanila.fi/CO2.xlsx', index_col = 0, date_parser = parser)
df2.head()
Out[4]:
CO2
Kuukausi
1999-12 368.04
2000-1 369.25
2000-2 369.50
2000-3 370.56
2000-4 371.82

Esimerkki 2 - tapa 1

In [5]:
# Avaan aikasarjatietoa sisältävän tiedoston ja katson aikatiedon esitysmuodon
df3 = pd.read_csv('http://taanila.fi/Electric_Production.csv')
df3.head()
Out[5]:
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 [6]:
# 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[6]:
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

Esimerkki 2 - tapa 2

In [7]:
# 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()
<ipython-input-7-fb9c0a91d5de>:3: FutureWarning: The pandas.datetime class is deprecated and will be removed from pandas in a future version. Import from datetime module instead.
  return pd.datetime.strptime(x, '%m/%d/%Y')
Out[7]:
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

Aikaleimojen luominen

Voin luoda sarjan aikaleimoja 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 [8]:
# 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[8]:
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