这几天在处理从PEMS上下载下来的交通流数据,今天下午主要做了pandas时序数据画图与求差集方面的工作,在这里整理下。
首先将整理好的数据导入,后将时间属性设置为index,代码如下
import pandas as pd
traffic_data = pd.read_csv('Mainline_VDS_500010021.csv')
traffic_data['5 Minutes'] = pd.to_datetime(traffic_data['5 Minutes'])
traffic_data.set_index(['5 Minutes'], inplace=True)
画图只需调用plot()方法即可,需要注意的是可以通过ix()函数确定需要显示的时间范围,plot()还有figsize属性可以确定图像大小。因为PEMS输出的数据中Lane x Flow (Veh/5 Minutes)
属性代表交通流量,所以就只把这个属性画出来
data = traffic_data[['Lane 1 Flow (Veh/5 Minutes)']]
data.ix['2019-01-01':'2019-01-01'].plot(figsize=(20,10))
最终画出来的图像如下所示
今天下午百度了半天但并没有发现pandas有相关的函数,所以在查阅了下资料后决定用比较笨的方法求差集。主要思路是采用drop_duplicates()
函数中的keep
属性,首先先看下pandas的官方文档
keep : {‘first’, ‘last’, False}, default ‘first’
first
: Drop duplicates except for the first occurrence.last
: Drop duplicates except for the last occurrence.- False : Drop all duplicates.
如果我令keep=False
,则所有重复项都会被删除。
这就好办了,首先我们先把两个Datetimeindex导入或者直接生成出来。
import pandas as pd
# 源数据中提取时间信息
raw_traffic_data = pd.read_csv('Mainline_VDS_500010021.csv')
real_date = raw_traffic_data[['5 Minutes']]
real_date = pd.DatetimeIndex(pd.to_datetime(real_date['5 Minutes']))
# 已知起始时间、开始时间与间隔,可以自动生成所有时间戳
date_range = pd.date_range(start='2019-01-01 00:00:00',
end ='2019-06-30 23:55:00',
freq ='5min')
可以从上述代码中看出,real_date
是data_range
的一个子集,将两个变量合成一个变量,再借用drop_duplicates()
中的keep
属性可以删除所有相同的属性,留下来的便是real_date
中缺失的时间戳
missing_date = date_range.append(real_date).drop_duplicates(keep=False)
可以看出少了3月1日凌晨2点左右的12个数据
In [65]: missing_date
Out[65]:
DatetimeIndex(['2019-03-10 02:00:00', '2019-03-10 02:05:00',
'2019-03-10 02:10:00', '2019-03-10 02:15:00',
'2019-03-10 02:20:00', '2019-03-10 02:25:00',
'2019-03-10 02:30:00', '2019-03-10 02:35:00',
'2019-03-10 02:40:00', '2019-03-10 02:45:00',
'2019-03-10 02:50:00', '2019-03-10 02:55:00'],
dtype='datetime64[ns]', freq=None)D:\Anaconda\Anaconda3\envs\tensorflow\lib\site-packages\spyder\widgets\variableexplorer\utils.py:414: FutureWarning: 'summary' is deprecated and will be removed in a future version.
display = value.summary()
为什么会产生这个需求呢?因为我中午在研究数据集,我一共下载了181天的数据,每天288个数据点,那么理论上数据集一共会有181*288=52128
个数据,可是实际少了12个数据,于是就想到了用求差集的方法找出缺失的数据。缺失数据的处理我就直接在csv文件中手动修改了。