Pandas时间序列处理

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())

猜你喜欢

转载自blog.csdn.net/happy5205205/article/details/80908770