Pandas時間序列處理
阿新 • • 發佈:2019-01-04
1、建立
from datetime import datetime
import pandas as pd
import numpy as np
# 指定index為datetime的list
date_list = [datetime(2018, 3, 3), datetime(2018, 3, 4),
datetime(2018, 3, 10), datetime(2018, 3, 11),
datetime(2018, 3, 17), datetime(2018, 3, 18)]
time_s = pd.Series(np.random.randn(6 ), index=date_list)
print(time_s)
print(type(time_s.index))
# pd.date_range()
dates = pd.date_range('2018-03-03', # 起始日期
periods=5, # 週期
freq='W-SAT') # 頻率
print(dates)
print(pd.Series(np.random.randn(5), index=dates))
2、索引
# 索引位置
print(time_s[0])
# 索引值
print(time_s[datetime(2018, 3, 3)])
# 可以被解析的日期字串
print(time_s['20180303'])
# 按“年份”、“月份”索引
print(time_s['2018-3'])
# 切片操作
print(time_s['2018-3-6':])
3、過濾
print(time_s)
tims_s2 = time_s.truncate(before='2018-3-15')
print(tims_s2)
print(time_s.truncate(after='2018-3-15'))
4、生成日期範圍
# 傳入開始、結束日期,預設生成的該時間段的時間點是按天計算的
date_index = pd.date_range('2018/03/03', '2018/03/31')
print(date_index)
# 只傳入開始或結束日期,還需要傳入時間段
print(pd.date_range(start='2018/03/03', periods=10, freq='4D'))
print(pd.date_range(end='2018/03/31', periods=10))
# 規範化時間戳
print(pd.date_range(start='2018/08/03 12:13:14', periods=10))
print(pd.date_range(start='2018/08/03 12:13:14', periods=10, normalize=True))
5、頻率與偏移量
print(pd.date_range('2018/03/03', '2018/03/31', freq='2D'))
# 偏移量通過加法連線
sum_offset = pd.tseries.offsets.Week(2) + pd.tseries.offsets.Hour(12)
print(sum_offset)
print(pd.date_range('2018/03/03', '2018/03/31', freq=sum_offset))
6、移動資料
ts = pd.Series(np.random.randn(5), index=pd.date_range('20180303', periods=5, freq='W-SAT'))
print(ts)
print(ts.shift(1))
#print(ts.shift(-1))
7、時間資料重取樣
# 1、resample
import pandas as pd
import numpy as np
date_rng = pd.date_range('20180303', periods=100, freq='D')
ser_obj = pd.Series(range(len(date_rng)), index=date_rng)
print(ser_obj.head(10))
# 統計每個月的資料總和
resample_month_sum = ser_obj.resample('M').sum()
# 統計每個月的資料平均
resample_month_mean = ser_obj.resample('M').mean()
print('按月求和:', resample_month_sum)
print('按月求均值:', resample_month_mean)
# 2、降取樣
# 將資料聚合到5天的頻率
five_day_sum_sample = ser_obj.resample('5D').sum()
five_day_mean_sample = ser_obj.resample('5D').mean()
five_day_ohlc_sample = ser_obj.resample('5D').ohlc()
print('降取樣,sum')
print(five_day_sum_sample)
print('降取樣,mean')
print(five_day_mean_sample)
print('降取樣,ohlc')
print(five_day_ohlc_sample)
# 使用groupby降取樣
print(ser_obj.groupby(lambda x: x.month).sum())
print(ser_obj.groupby(lambda x: x.weekday).sum())
# 3、升取樣
df = pd.DataFrame(np.random.randn(5, 3),
index=pd.date_range('20180101', periods=5, freq='W-MON'),
columns=['S1', 'S2', 'S3'])
print(df)
# 直接重取樣會產生空值
print(df.resample('D').bfill())
#ffill
print(df.resample('D').ffill(2))
print(df.resample('D').bfill())
print(df.resample('D').fillna('ffill'))
print(df.resample('D').interpolate('linear'))
8、時間序列資料統計—滑動視窗
# 1、視窗函式
import pandas as pd
import numpy as np
ser_obj = pd.Series(np.random.randn(1000),
index=pd.date_range('20180101', periods=1000))
ser_obj = ser_obj.cumsum()
print(ser_obj.head())
print(ser_obj.head())
r_obj = ser_obj.rolling(window=5)
print(r_obj)
print(r_obj.mean())
# 驗證:
# 前5個數據的均值
# print(ser_obj[0:5].mean())
# 1-6個數據的均值
# print(ser_obj[1:6].mean())
# 畫圖檢視
import matplotlib.pyplot as plt
plt.figure(figsize=(15, 5))
ser_obj.plot(style='r--')
ser_obj.rolling(window=10, center=True).mean().plot(style='b')
print(ser_obj.rolling(window=5, center=True).mean())