Cara menggunakan DT.DATE pada Python

Halo Pythonista.. Dalam mengolah data terkadang kita memiliki data yang berupa time series. Dalam pengolahan data time series ini kita bisa menggunakan beberapa operasi seperti selection, wrangling dan agregation.

Sebelum kita menggunakan Pandas, akan membantu pemahaman jika kita mengenal Python datetime. Modul datetime menyediakan 3 tipe data: date, time dan datetime. Tipe data date, berisi tanggal, bulan dan tahun. Tipe data time, berisi jam, menit dan detik. Sedangkan tipe datetime berise kedua date dan time. Di sisi lain, Pandas memiliki objek Timestamp yang mewakili date dan time.

Pertama, kita akan coba eksplorasi date time di Python lalu kemudian ke Pandas.

  1. Pertama kita impor modul  datetime terlebih dahulu.

>>> import datetime

>>> date = datetime.date(year=2013, month=6, day=7)

>>> time = datetime.time(hour=12, minute=30,

second=19, microsecond=463198)

>>> dt = datetime.datetime(year=2013, month=6, day=7,

hour=12, minute=30, second=19,

microsecond=463198)

>>> print(“date is “, date)

>>> print(“time is”, time)

>>> print(“datetime is”, dt)

date is 2013-06-07

time is 12:30:19.463198

datetime is 2013-06-07 12:30:19.463198

  1. Buat sebuah timedelta objek (salah 1 tipedata dalam datetime)

>>> td = datetime.timedelta(weeks=2, days=5, hours=10,

minutes=20, seconds=6.73,

milliseconds=99, microseconds=8)

>>> print(td)

19 days, 10:20:06.829008

  1. Tambahkan timedelta ke date dan objek datetime

>>> print(‘new date is’, date + td)

>>> print(‘new datetime is’, dt + td)

new date is 2013-06-26

new datetime is 2013-06-26 22:50:26.292206

  1. Menambahkan timedelta ke objek time tidak memungkinkan.

>>> time + td

TypeError: unsupported operand type(s) for +: ‘datetime.time’ and

‘datetime.timedelta’

  1. Gunakan Pandas dan objek Timestampnya.

>>> pd.Timestamp(year=2012, month=12, day=21, hour=5,

minute=10, second=8, microsecond=99)

Timestamp(‘2012-12-21 05:10:08.000099’)

>>> pd.Timestamp(‘2016/1/10’)

Timestamp(‘2016-01-10 00:00:00’)

>>> pd.Timestamp(‘2014-5/10’)

Timestamp(‘2014-05-10 00:00:00’)

>>> pd.Timestamp(‘Jan 3, 2019 20:45.56’)

Timestamp(‘2019-01-03 20:45:33’)

>>> pd.Timestamp(‘2016-01-05T05:34:43.123456789’)

Timestamp(‘2016-01-05 05:34:43.123456789’)

It’s also possible to pass in a single integer or float to the Timestamp constructor

  1. Memungkinkan juga untuk kita menggunakan single integer ataupun float dengan Timestamp, yang mana akan mengembalikan tanggal yang sesuai dengan nilai nanosecond

>>> pd.Timestamp(500)

Timestamp(‘1970-01-01 00:00:00.000000500′)

>>> pd.Timestamp(5000, unit=’D’)

Timestamp(‘1983-09-10 00:00:00’)

Pandas provides the to_datetime function that works fairly similarly to the

  1. Pandas menyediakan fungsi to_datetime yang bekerja dengan Timestamp.

>>> pd.to_datetime(‘2015-5-13’)

Timestamp(‘2015-05-13 00:00:00’)

>>> pd.to_datetime(‘2015-13-5’, dayfirst=True)

Timestamp(‘2015-05-13 00:00:00’)

>>> pd.to_datetime(‘Start Date: Sep 30, 2017 Start Time: 1:30 pm’,

format=’Start Date: %b %d, %Y Start Time: %I:%M %p’)

Timestamp(‘2017-09-30 13:30:00′)

>>> pd.to_datetime(100, unit=’D’, origin=’2013-1-1′)

Timestamp(‘2013-04-11 00:00:00’)

  1. fungsi to_datetime bisa digunakan untuk series dan dataframe

>>> s = pd.Series([10, 100, 1000, 10000])

>>> pd.to_datetime(s, unit=’D’)

0 1970-01-11

1 1970-04-11

2 1972-09-27

3 1997-05-19

dtype: datetime64[ns]

>>> s = pd.Series([’12-5-2015′, ’14-1-2013′,

’20/12/2017′, ’40/23/2017′])

>>> pd.to_datetime(s, dayfirst=True, errors=’coerce’)

0 2015-05-12

1 2013-01-14

2 2017-12-20

Pada materi kali ini, kita akan coba menggunakan sebuah dataset harga saham yang bisa diunduh disini : microsoft_stock.csv

Untuk memudahkan analisis data time series ini, ada beberapa argumen yang perlu kita tambahkan, seperti berikut:

microsoft = pd.read_csv(‘microsoft_stock.csv’, index_col=’Date’, parse_dates=True)

parse_dates pada syntaks diatas digunakan untuk mengubah date berupa objek menjadi format date yang sesuai sehingga kolom tersebut bisa dibaca. Output dari pembacaan data di atas adalah:

Cara menggunakan DT.DATE pada Python

Selection and Filtering

Kita bisa melakukan indexing hanya di waktu tertentu. seperti berikut:

Cara menggunakan DT.DATE pada Python

Dalam case stock data, cara diatas menampilkan keseluruhan data saham di tahun 2021. Kita bisa melakukan filtering hanya menampilkan di bulan tertentu atau di range tertentu, seperti berikut:

Cara menggunakan DT.DATE pada Python

Cara menggunakan DT.DATE pada Python

Jika kita menginginkan untuk menampilkan ‘beginning’ dan ‘end’, Pandas memiliki atribut .first()

dan .last(). Sebagai contoh, kita ingin menampilkan harga saham di tahun 2021 pada minggu pertama :

Cara menggunakan DT.DATE pada Python

Jika kita ingin menampilan harga saham minggu terakhir di tahun 2021, seperti berikut:

Cara menggunakan DT.DATE pada Python

Time Grouping

Dalam data time series, kita juga bisa melakukan grouping untuk menampilkan data berdasarkan waktu tertentu dan agregasi tertentu. Sebagai contoh, kita ingin menampilkan data saham microsoft di tahun 2021 dalam 1 pekan dengan kondisi harga yang ditampilkan pada ‘Open’ adalah yang pertama, ‘High’ adalah nilai maksimum, ‘Low’ adalah nilai minimum, ‘Close’ harga terakhir dan agregat ‘sum’ untuk Volume. Dengan menggunakan syntaks seperti berikut:

microsoft[‘2021′].groupby(pd.Grouper(freq=’1W’)).agg({‘Open’:’first’, ‘High’:’max’, ‘Low’:’min’, ‘Close’: ‘last’, ‘Volume’:’sum’})

Jika ingin mengubah-ubah waktu yang kita inginkan, maka lakukan perubahan pada bagian freq=’ ‘ . Output dari syntaks di atas adalah:

Cara menggunakan DT.DATE pada Python

Shifting for Lagged Data

Lagged data adalah data yang nilainya muncul dari nilai sebelumnya. Untuk melakukan shifting data, Pandas memiliki atribut .shift(). Misalkan kita ingin melihat harga saham di penutupan hari sebelumnya. Dengan menggunakan syntaks seperti berikut:

microsoft.assign(prior_close=lambda x: x.Close.shift(), after_hours_change_in_price=lambda x: x.Open – x.prior_close,abs_change=lambda x: x.after_hours_change_in_price.abs()

).nlargest(5, ‘abs_change’)

Cara menggunakan DT.DATE pada Python

Differenced Data

Kita telah mencoba membuat lagged data dengan menggunakan atribut shift(). Tetapi terkadang, kita tertarik untuk melihat bagaimana perubahan harga setiap harinya. Pandas memiliki atribut .diff() dengan formula seperti berikut:

Cara menggunakan DT.DATE pada Python

Kita bisa menggunakan atribut .diff() untuk melihat perubahan harga saham microsoft setiap harinya.

Cara menggunakan DT.DATE pada Python

Resampling

Terkadang data yang begitu detail tidak kondusif untuk kita analisis. Misalkan kita punya seluruh data tiap menit harga saham microsoft di tahun 2021. Kemudian kita lakukan visualisasi, maka terkadang visual yang kita buat tidak memberikan makna apapun, sebagai ilustrasi seperti berikut:

Cara menggunakan DT.DATE pada Python

Untuk menampilkan visual dengan frekuensi tertentu, kita perlu melakukan resampling data dengan menggunakan resample(), sebagai contoh:

stock_data_per_minute.resample(‘1D’).agg(‘open’: ‘first’, ‘high’: ‘max’, ‘low’: ‘min’,’close’: ‘last’, ‘volume’: ‘sum’

})

Cara menggunakan DT.DATE pada Python

Syntaks dan output di atas hanya sebagai contoh tidak berhubungan dengan data microsoft.

Misalkan kita ingin melakukan resampling rata-rata triwulan harga saham micosoft harian, seperti berikut:

Cara menggunakan DT.DATE pada Python

Time Merging

Dalam data time series, kita bisa melakukan merging. kita dapat menggunakan pd.merge_asof() untuk mencocokkan di sekitar key daripada pada key yang sama. Di sisi lain, jika kita mau mencocokkan key yang sama dan menggunakan key tanpa kecocokan, kita dapat menggunakan pd.merge_ordered().Sebagai contoh antara data fb dan Apple: (dataset tidak disertakan, ini hanya sebagai contoh)

>>> fb_prices.index.second.unique()

Int64Index([0], dtype=’int64′, name=’date’)

>>> aapl_prices.index.second.unique()

Int64Index([ 0, 52, 36, 34, 55, 35, 7, 12, 59, 17, 5, 20, 26,

23, 54, 49, 19, 53, 11, 22, 13, 21, 10, 46, 42, 38,

33, 18, 16, 9, 56, 39, 2, 50, 31, 58, 48, 24, 29,

6, 47, 51, 40, 3, 15, 14, 25, 4, 43, 8, 32, 27,

30, 45, 1, 44, 57, 41, 37, 28],

dtype=’int64′, name=’date’)

pd.merge_asof(fb_prices, aapl_prices,left_index=True, right_index=True,

direction=’nearest’, tolerance=pd.Timedelta(30, unit=’s’)).head()

Cara menggunakan DT.DATE pada Python

pd.merge_ordered(fb_prices.reset_index(), aapl_prices.reset_index()).set_index(‘date’).head()

Cara menggunakan DT.DATE pada Python