python日期处理(pandas)
python有内置的日期处理模块,datetime,但是这里主要介绍pandas的日期处理功能
1. pandas中的日期基本数据类型Timestamp 单个日期通过 pd.to_datetime() 将字符串格式的日期,变成Timestamp类型
DatetimeIndex 多个独立的日期组合起来
PeriodIndex 指定了间隔频率的DatetimeIndex通过将DatetimeIndex.to_period("D"),指定间隔频率来得到
TimedeltaIndex 针对时间增量或者持续时间当用一个日期减去另一个日期,放回结果就是上述类型
2. 有规律的时间序列pd.date_range()指定一个时间区段,频率、自动生成这个区间
pd.date_range('2019-12-8', periods=4)
pd.date_range('2019-12-8', '2019-12-12')
pd.date_range('2019-12-8', periods=4, freq='H')
创建生成的对象为 DatetimeIndex类型
pd.period_range()使用上述类似的方法,生成区间
创建生成的对象为 PeriodIndex类型
pd.timedelta_range()使用上述类似的方法,生成区间
创建生成的对象为 TimedeltaIndex 类型
3. 日期处理实例
用到的数据获取链接:
写好的jupyter notebook文件也在此仓库
import numpy as np
import pandas as pd
data = pd.read_csv("Fremont_Bridge_Bicycle_Counter.csv", index_col="Date", parse_dates=True)
data.head()
data.columns = ['Total','West', 'East']
data.head()
data.dropna().describe()
3.1 数据可视化
%matplotlib inline
import seaborn
seaborn.set()
import matplotlib.pyplot as plt
data.plot()
plt.ylabel("Hourly Bicycle Count")
3.2 增大时间粒度
上述时间粒度太细,看不出趋势,重新取样成较大的时间粒度
resample
按周累计上述数据,重新绘图
weekly = data.resample("W").sum()
weekly.plot(style=[':','--','-'])
plt.ylabel("Weekly bicycle count")
数据累计平均
另一种对数据进行累计的简便方法
计算30天的移动平均值
daily = data.resample("D").sum()
daily.rolling(30, center=True).mean().plot(style=[':','--','-'])
plt.ylabel("mean of 30 days count")
移动平均
使用移动平均 来平滑曲线
高斯分布时间窗口
窗口宽度=50天 窗口内高斯平滑宽度=10天
daily.rolling(50, center=True,
win_type="gaussian").sum(std=10).plot(style=[':','--','-'])
3.3 后续
后续代码不再展示,查看《python数据科学手册》P182 后面还对每小时的自行车流量
每周每天的自行车流量
工作日,双休日每小时的自行车流量
做了分析,主要用到了数据透视 groupby 操作