溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些

發(fā)布時(shí)間:2023-04-26 14:25:00 來源:億速云 閱讀:137 作者:zzz 欄目:編程語言

這篇文章主要講解了“Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些”吧!

時(shí)間序列數(shù)據(jù)是一種在一段時(shí)間內(nèi)收集的數(shù)據(jù)類型,它通常用于金融、經(jīng)濟(jì)學(xué)和氣象學(xué)等領(lǐng)域,經(jīng)常通過分析來了解隨著時(shí)間的推移的趨勢(shì)和模式

Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些

Pandas是Python中一個(gè)強(qiáng)大且流行的數(shù)據(jù)操作庫(kù),特別適合處理時(shí)間序列數(shù)據(jù)。它提供了一系列工具和函數(shù)可以輕松加載、操作和分析時(shí)間序列數(shù)據(jù)。

在本文中,我們介紹時(shí)間序列數(shù)據(jù)的索引和切片、重新采樣和滾動(dòng)窗口計(jì)算以及其他有用的常見操作,這些都是使用Pandas操作時(shí)間序列數(shù)據(jù)的關(guān)鍵技術(shù)。

數(shù)據(jù)類型

Python

在Python中,沒有專門用于表示日期的內(nèi)置數(shù)據(jù)類型。一般情況下都會(huì)使用datetime模塊提供的datetime對(duì)象進(jìn)行日期時(shí)間的操作。

import datetime

t = datetime.datetime.now()
print(f"type: {type(t)} and t: {t}")
#type:and t: 2022-12-26 14:20:51.278230

一般情況下我們都會(huì)使用字符串的形式存儲(chǔ)日期和時(shí)間。所以在使用時(shí)我們需要將這些字符串進(jìn)行轉(zhuǎn)換成datetime對(duì)象。

一般情況下時(shí)間的字符串有以下格式:

  • YYYY-MM-DD (e.g. 2022-01-01)

  • YYYY/MM/DD (e.g. 2022/01/01)

  • DD-MM-YYYY (e.g. 01-01-2022)

  • DD/MM/YYYY (e.g. 01/01/2022)

  • MM-DD-YYYY (e.g. 01-01-2022)

  • MM/DD/YYYY (e.g. 01/01/2022)

  • HH:MM:SS (e.g. 11:30:00)

  • HH:MM:SS AM/PM (e.g. 11:30:00 AM)

  • HH:MM AM/PM (e.g. 11:30 AM)

strptime 函數(shù)以字符串和格式字符串作為參數(shù),返回一個(gè)datetime對(duì)象。

string = '2022-01-01 11:30:09'
t = datetime.datetime.strptime(string, "%Y-%m-%d %H:%M:%S")
print(f"type: {type(t)} and t: {t}")
#type:and t: 2022-01-01 11:30:09

格式字符串如下:

Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些

還可以使用strftime函數(shù)將datetime對(duì)象轉(zhuǎn)換回特定格式的字符串表示。

t = datetime.datetime.now()
t_string = t.strftime("%m/%d/%Y, %H:%M:%S")
#12/26/2022, 14:38:47

t_string = t.strftime("%b/%d/%Y, %H:%M:%S")
#Dec/26/2022, 14:39:32

Unix時(shí)間(POSIX時(shí)間或epoch時(shí)間)是一種將時(shí)間表示為單個(gè)數(shù)值的系統(tǒng)。它表示自1970年1月1日星期四00:00:00協(xié)調(diào)世界時(shí)(UTC)以來經(jīng)過的秒數(shù)。

Unix時(shí)間和時(shí)間戳通??梢曰Q使用。Unix時(shí)間是創(chuàng)建時(shí)間戳的標(biāo)準(zhǔn)版本。一般情況下使用整數(shù)或浮點(diǎn)數(shù)據(jù)類型用于存儲(chǔ)時(shí)間戳和Unix時(shí)間。

我們可以使用time模塊的mktime方法將datetime對(duì)象轉(zhuǎn)換為Unix時(shí)間整數(shù)。也可以使用datetime模塊的fromtimestamp方法。

#convert datetime to unix time
import time
from datetime import datetime

t = datetime.now()
unix_t = int(time.mktime(t.timetuple()))
#1672055277

#convert unix time to datetime
unix_t = 1672055277
t = datetime.fromtimestamp(unix_t)
#2022-12-26 14:47:57

使用dateutil模塊來解析日期字符串獲得datetime對(duì)象。

from dateutil import parser
date = parser.parse("29th of October, 1923")
#datetime.datetime(1923, 10, 29, 0, 0)
Pandas

Pandas提供了三種日期數(shù)據(jù)類型:

1、Timestamp或DatetimeIndex:它的功能類似于其他索引類型,但也具有用于時(shí)間序列操作的專門函數(shù)。

t = pd.to_datetime("29/10/1923", dayfirst=True)
#Timestamp('1923-10-29 00:00:00')

t = pd.Timestamp('2019-01-01', tz = 'Europe/Berlin')
#Timestamp('2019-01-01 00:00:00+0100', tz='Europe/Berlin')

t = pd.to_datetime(["04/23/1920", "10/29/1923"])
#DatetimeIndex(['1920-04-23', '1923-10-29'], dtype='datetime64[ns]', freq=None)

2、period或PeriodIndex:一個(gè)有開始和結(jié)束的時(shí)間間隔。它由固定的間隔組成。

t = pd.to_datetime(["04/23/1920", "10/29/1923"])
period = t.to_period("D")
#PeriodIndex(['1920-04-23', '1923-10-29'], dtype='period[D]')

3、Timedelta或TimedeltaIndex:兩個(gè)日期之間的時(shí)間間隔。

delta = pd.TimedeltaIndex(data =['1 days 03:00:00',
 '2 days 09:05:01.000030'])
"""
TimedeltaIndex(['1 days 02:00:00', '1 days 06:05:01.000030'],
dtype='timedelta64[ns]', freq=None)
"""

在Pandas中,可以使用to_datetime方法將對(duì)象轉(zhuǎn)換為datetime數(shù)據(jù)類型或進(jìn)行任何其他轉(zhuǎn)換。

import pandas as pd
df = pd.read_csv("dataset.txt")
df.head()

"""

date value
0 1991-07-01 3.526591
1 1991-08-01 3.180891
2 1991-09-01 3.252221
3 1991-10-01 3.611003
4 1991-11-01 3.565869
"""

df.info()

"""RangeIndex: 204 entries, 0 to 203
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 204 non-null object
1 value 204 non-null float64
dtypes: float64(1), object(1)
memory usage: 3.3+ KB
"""

# Convert to datetime
df["date"] = pd.to_datetime(df["date"], format = "%Y-%m-%d")

df.info()

"""RangeIndex: 204 entries, 0 to 203
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 204 non-null datetime64[ns]
1 value 204 non-null float64
dtypes: datetime64[ns](1), float64(1)
memory usage: 3.3 KB
"""

# Convert to Unix
df['unix_time'] = df['date'].apply(lambda x: x.timestamp())
df.head()
"""
date value unix_time
0 1991-07-01 3.526591 678326400.0
1 1991-08-01 3.180891 681004800.0
2 1991-09-01 3.252221 683683200.0
3 1991-10-01 3.611003 686275200.0
4 1991-11-01 3.565869 688953600.0
"""

df["date_converted_from_unix"] = pd.to_datetime(df["unix_time"], unit = "s")
df.head()
"""
date value unix_time date_converted_from_unix
0 1991-07-01 3.526591 678326400.0 1991-07-01
1 1991-08-01 3.180891 681004800.0 1991-08-01
2 1991-09-01 3.252221 683683200.0 1991-09-01
3 1991-10-01 3.611003 686275200.0 1991-10-01
4 1991-11-01 3.565869 688953600.0 1991-11-01
"""

我們還可以使用parse_dates參數(shù)在任何文件加載時(shí)直接聲明日期列。

df = pd.read_csv("dataset.txt", parse_dates=["date"])
df.info()

"""RangeIndex: 204 entries, 0 to 203
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 204 non-null datetime64[ns]
1 value 204 non-null float64
dtypes: datetime64[ns](1), float64(1)
memory usage: 3.3 KB
"""

如果是單個(gè)時(shí)間序列的數(shù)據(jù),最好將日期列作為數(shù)據(jù)集的索引。

df.set_index("date",inplace=True)

"""
Value
date
1991-07-01 3.526591
1991-08-01 3.180891
1991-09-01 3.252221
1991-10-01 3.611003
1991-11-01 3.565869
... ...
2008-02-01 21.654285
2008-03-01 18.264945
2008-04-01 23.107677
2008-05-01 22.912510
2008-06-01 19.431740
"""

Numpy也有自己的datetime類型np.Datetime64。特別是在大型數(shù)據(jù)集時(shí),向量化是非常有用的,應(yīng)該優(yōu)先使用。

import numpy as np
arr_date = np.array('2000-01-01', dtype=np.datetime64)
arr_date
#array('2000-01-01', dtype='datetime64[D]')

#broadcasting
arr_date = arr_date + np.arange(30)
"""
array(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04',
'2000-01-05', '2000-01-06', '2000-01-07', '2000-01-08',
'2000-01-09', '2000-01-10', '2000-01-11', '2000-01-12',
'2000-01-13', '2000-01-14', '2000-01-15', '2000-01-16',
'2000-01-17', '2000-01-18', '2000-01-19', '2000-01-20',
'2000-01-21', '2000-01-22', '2000-01-23', '2000-01-24',
'2000-01-25', '2000-01-26', '2000-01-27', '2000-01-28',
'2000-01-29', '2000-01-30'], dtype='datetime64[D]')
"""

有用的函數(shù)

下面列出的是一些可能對(duì)時(shí)間序列有用的函數(shù)。

df = pd.read_csv("dataset.txt", parse_dates=["date"])
df["date"].dt.day_name()

"""
0 Monday
1 Thursday
2 Sunday
3 Tuesday
4 Friday
...
199 Friday
200 Saturday
201 Tuesday
202 Thursday
203 Sunday
Name: date, Length: 204, dtype: object
"""
DataReader

Pandas_datareader是pandas庫(kù)的一個(gè)輔助庫(kù)。它提供了許多常見的金融時(shí)間序列數(shù)據(jù)。

#pip install pandas-datareader
from pandas_datareader import wb
#GDP per Capita From World Bank
df = wb.download(indicator='NY.GDP.PCAP.KD',
 country=['US', 'FR', 'GB', 'DK', 'NO'], start=1960, end=2019)

"""
NY.GDP.PCAP.KD
country year
Denmark 2019 57203.027794
2018 56563.488473
2017 55735.764901
2016 54556.068955
2015 53254.856370
... ...
United States 1964 21599.818705
1963 20701.269947
1962 20116.235124
1961 19253.547329
1960 19135.268182

[300 rows x 1 columns]
"""
日期范圍

我們可以使用pandas的date_range方法定義一個(gè)日期范圍。

pd.date_range(start="2021-01-01", end="2022-01-01", freq="D")

"""
DatetimeIndex(['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04',
'2021-01-05', '2021-01-06', '2021-01-07', '2021-01-08',
'2021-01-09', '2021-01-10',
...
'2021-12-23', '2021-12-24', '2021-12-25', '2021-12-26',
'2021-12-27', '2021-12-28', '2021-12-29', '2021-12-30',
'2021-12-31', '2022-01-01'],
dtype='datetime64[ns]', length=366, freq='D')
"""

pd.date_range(start="2021-01-01", end="2022-01-01", freq="BM")

"""
DatetimeIndex(['2021-01-29', '2021-02-26', '2021-03-31', '2021-04-30',
'2021-05-31', '2021-06-30', '2021-07-30', '2021-08-31',
'2021-09-30', '2021-10-29', '2021-11-30', '2021-12-31'],
dtype='datetime64[ns]', freq='BM')
"""

fridays= pd.date_range('2022-11-01', '2022-12-31', freq="W-FRI")
"""
DatetimeIndex(['2022-11-04', '2022-11-11', '2022-11-18', '2022-11-25',
'2022-12-02', '2022-12-09', '2022-12-16', '2022-12-23',
'2022-12-30'],
dtype='datetime64[ns]', freq='W-FRI')
"""

Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些

我們可以使用timedelta_range方法創(chuàng)建一個(gè)時(shí)間序列。

t = pd.timedelta_range(0, periods=10, freq="H")

"""
TimedeltaIndex(['0 days 00:00:00', '0 days 01:00:00', '0 days 02:00:00',
'0 days 03:00:00', '0 days 04:00:00', '0 days 05:00:00',
'0 days 06:00:00', '0 days 07:00:00', '0 days 08:00:00',
'0 days 09:00:00'],
dtype='timedelta64[ns]', freq='H')
"""
格式化

我們dt.strftime方法改變?nèi)掌诹械母袷健?/p>

df["new_date"] = df["date"].dt.strftime("%b %d, %Y")
df.head()
"""
date value new_date
0 1991-07-01 3.526591 Jul 01, 1991
1 1991-08-01 3.180891 Aug 01, 1991
2 1991-09-01 3.252221 Sep 01, 1991
3 1991-10-01 3.611003 Oct 01, 1991
4 1991-11-01 3.565869 Nov 01, 1991
"""
解析

解析datetime對(duì)象并獲得日期的子對(duì)象。

df["year"] = df["date"].dt.year
df["month"] = df["date"].dt.month
df["day"] = df["date"].dt.day
df["calendar"] = df["date"].dt.date
df["hour"] = df["date"].dt.time
df.head()
"""
date value year month day calendar hour
0 1991-07-01 3.526591 1991 7 1 1991-07-01 00:00:00
1 1991-08-01 3.180891 1991 8 1 1991-08-01 00:00:00
2 1991-09-01 3.252221 1991 9 1 1991-09-01 00:00:00
3 1991-10-01 3.611003 1991 10 1 1991-10-01 00:00:00
4 1991-11-01 3.565869 1991 11 1 1991-11-01 00:00:00
"""

還可以重新組合它們。

df["date_joined"] = pd.to_datetime(df[["year","month","day"]])
print(df["date_joined"])
"""
0 1991-07-01
1 1991-08-01
2 1991-09-01
3 1991-10-01
4 1991-11-01
...
199 2008-02-01
200 2008-03-01
201 2008-04-01
202 2008-05-01
203 2008-06-01
Name: date_joined, Length: 204, dtype: datetime64[ns]
過濾查詢

使用loc方法來過濾DataFrame。

df = df.loc["2021-01-01":"2021-01-10"]

Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些

truncate 可以查詢兩個(gè)時(shí)間間隔中的數(shù)據(jù)

df_truncated = df.truncate('2021-01-05', '2022-01-10')

Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些

常見數(shù)據(jù)操作

下面就是對(duì)時(shí)間序列數(shù)據(jù)集中的值執(zhí)行操作。我們使用yfinance庫(kù)創(chuàng)建一個(gè)用于示例的股票數(shù)據(jù)集。

#get google stock price data
import yfinance as yf
start_date = '2020-01-01'
end_date = '2023-01-01'
ticker = 'GOOGL'
df = yf.download(ticker, start_date, end_date)
df.head()

"""
Date Open High Low Close Adj Close Volume
2020-01-02 67.420502 68.433998 67.324501 68.433998 68.433998 27278000
2020-01-03 67.400002 68.687500 67.365997 68.075996 68.075996 23408000
2020-01-06 67.581497 69.916000 67.550003 69.890503 69.890503 46768000
2020-01-07 70.023003 70.175003 69.578003 69.755501 69.755501 34330000
2020-01-08 69.740997 70.592499 69.631500 70.251999 70.251999 35314000
"""
計(jì)算差值

diff函數(shù)可以計(jì)算一個(gè)元素與另一個(gè)元素之間的插值。

#subtract that day's value from the previous day
df["Diff_Close"] = df["Close"].diff()
#Subtract that day's value from the day's value 2 days ago
df["Diff_Close_2Days"] = df["Close"].diff(periods=2)

Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些

累計(jì)總數(shù)
df["Volume_Cumulative"] = df["Volume"].cumsum()

Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些

滾動(dòng)窗口計(jì)算

滾動(dòng)窗口計(jì)算(移動(dòng)平均線)。

df["Close_Rolling_14"] = df["Close"].rolling(14).mean()
df.tail()

Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些

可以對(duì)我們計(jì)算的移動(dòng)平均線進(jìn)行可視化

Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些

常用的參數(shù):

  • center:決定滾動(dòng)窗口是否應(yīng)以當(dāng)前觀測(cè)值為中心。

  • min_periods:窗口中產(chǎn)生結(jié)果所需的最小觀測(cè)次數(shù)。

s = pd.Series([1, 2, 3, 4, 5])

#the rolling window will be centered on each observation
rolling_mean = s.rolling(window=3, center=True).mean()
"""
0 NaN
1 2.0
2 3.0
3 4.0
4 NaN
dtype: float64
Explanation:
first window: [na 1 2] = na
second window: [1 2 3] = 2
"""

# the rolling window will not be centered,
#and will instead be anchored to the left side of the window
rolling_mean = s.rolling(window=3, center=False).mean()
"""
0 NaN
1 NaN
2 2.0
3 3.0
4 4.0
dtype: float64
Explanation:
first window: [na na 1] = na
second window: [na 1 2] = na
third window: [1 2 3] = 2
"""
平移

Pandas有兩個(gè)方法,shift()和tshift(),它們可以指定倍數(shù)移動(dòng)數(shù)據(jù)或時(shí)間序列的索引。Shift()移位數(shù)據(jù),而tshift()移位索引。

#shift the data
df_shifted = df.shift(5,axis=0)
df_shifted.head(10)

#shift the indexes
df_tshifted = df.tshift(periods = 4, freq = 'D')
df_tshifted.head(10)

Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些

df_shifted

Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些

df_tshifted

時(shí)間間隔轉(zhuǎn)換

在 Pandas 中,操 to_period 函數(shù)允許將日期轉(zhuǎn)換為特定的時(shí)間間隔??梢垣@取具有許多不同間隔或周期的日期

df["Period"] = df["Date"].dt.to_period('W')

Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些

頻率

Asfreq方法用于將時(shí)間序列轉(zhuǎn)換為指定的頻率。

monthly_data = df.asfreq('M', method='ffill')

Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些

常用參數(shù):

freq:數(shù)據(jù)應(yīng)該轉(zhuǎn)換到的頻率。這可以使用字符串別名(例如,'M'表示月,'H'表示小時(shí))或pandas偏移量對(duì)象來指定。

method:如何在轉(zhuǎn)換頻率時(shí)填充缺失值。這可以是'ffill'(向前填充)或'bfill'(向后填充)之類的字符串。

采樣

resample可以改變時(shí)間序列頻率并重新采樣。我們可以進(jìn)行上采樣(到更高的頻率)或下采樣(到更低的頻率)。因?yàn)槲覀冋诟淖冾l率,所以我們需要使用一個(gè)聚合函數(shù)(比如均值、最大值等)。

resample方法的參數(shù):

rule:數(shù)據(jù)重新采樣的頻率。這可以使用字符串別名(例如,'M'表示月,'H'表示小時(shí))或pandas偏移量對(duì)象來指定。

#down sample
monthly_data = df.resample('M').mean()

Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些

#up sample
minute_data = data.resample('T').ffill()

Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些

百分比變化

使用pct_change方法來計(jì)算日期之間的變化百分比。

df["PCT"] = df["Close"].pct_change(periods=2)
print(df["PCT"])
"""
Date
2020-01-02 NaN
2020-01-03 NaN
2020-01-06 0.021283
2020-01-07 0.024671
2020-01-08 0.005172
...
2022-12-19 -0.026634
2022-12-20 -0.013738
2022-12-21 0.012890
2022-12-22 -0.014154
2022-12-23 -0.003907
Name: PCT, Length: 752, dtype: float64
"""

感謝各位的閱讀,以上就是“Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Python時(shí)間序列數(shù)據(jù)操作的常用方法有哪些這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI