1、简单的了解生成一段时间范围
2、实际案例处理
案例一
案例一解析
案例二
案例二解析python
关于时间序列的一些基本知识点,本人了解不是太深刻,介绍一篇文章:pandas–处理时间序列数据web
import pandas as pd import numpy as np df = pd.date_range(start="20000101",end="20010101",freq="D") print(df) # DatetimeIndex(['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-12-23', '2000-12-24', '2000-12-25', '2000-12-26', # '2000-12-27', '2000-12-28', '2000-12-29', '2000-12-30', # '2000-12-31', '2001-01-01'], # dtype='datetime64[ns]', length=367, freq='D') df = pd.date_range(start="2000-01-01",end="2001/01/01",freq="D") print(df) # DatetimeIndex(['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-12-23', '2000-12-24', '2000-12-25', '2000-12-26', # '2000-12-27', '2000-12-28', '2000-12-29', '2000-12-30', # '2000-12-31', '2001-01-01'], # dtype='datetime64[ns]', length=367, freq='D') df = pd.date_range(start="20000101",end="20010101",freq="10D") print(df) # DatetimeIndex(['2000-01-01', '2000-01-11', '2000-01-21', '2000-01-31', # '2000-02-10', '2000-02-20', '2000-03-01', '2000-03-11', # '2000-03-21', '2000-03-31', '2000-04-10', '2000-04-20', # '2000-04-30', '2000-05-10', '2000-05-20', '2000-05-30', # '2000-06-09', '2000-06-19', '2000-06-29', '2000-07-09', # '2000-07-19', '2000-07-29', '2000-08-08', '2000-08-18', # '2000-08-28', '2000-09-07', '2000-09-17', '2000-09-27', # '2000-10-07', '2000-10-17', '2000-10-27', '2000-11-06', # '2000-11-16', '2000-11-26', '2000-12-06', '2000-12-16', # '2000-12-26'], # dtype='datetime64[ns]', freq='10D') df = pd.date_range(start="20000101",periods=12,freq="M") print(df) # DatetimeIndex(['2000-01-31', '2000-02-29', '2000-03-31', '2000-04-30', # '2000-05-31', '2000-06-30', '2000-07-31', '2000-08-31', # '2000-09-30', '2000-10-31', '2000-11-30', '2000-12-31'], # dtype='datetime64[ns]', freq='M') df = pd.date_range(start="20000101",periods=12,freq="H") print(df) # DatetimeIndex(['2000-01-01 00:00:00', '2000-01-01 01:00:00', # '2000-01-01 02:00:00', '2000-01-01 03:00:00', # '2000-01-01 04:00:00', '2000-01-01 05:00:00', # '2000-01-01 06:00:00', '2000-01-01 07:00:00', # '2000-01-01 08:00:00', '2000-01-01 09:00:00', # '2000-01-01 10:00:00', '2000-01-01 11:00:00'], # dtype='datetime64[ns]', freq='H')
返回顶部svg
需求:统计出911紧急拨号数据中不一样月份的电话的次数的状况
函数
import numpy as np import pandas as pd from matplotlib import pyplot as plt from matplotlib import font_manager #设置中文 my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\STXINGKA.TTF",size=18) #读取csv文件 file_path = "911-calls/911.csv" df = pd.read_csv(file_path) df["timeStamp"] = pd.to_datetime(df["timeStamp"]) #将timeStamp转化为时间戳 df.set_index("timeStamp",inplace=True) #将timeStamp定义为索引 print(df) # lat ... e # timeStamp ... # 2015-12-10 17:10:52 40.297876 ... 1 # 2015-12-10 17:29:21 40.258061 ... 1 # 2015-12-10 14:39:21 40.121182 ... 1 # 2015-12-10 16:47:36 40.116153 ... 1 # 2015-12-10 16:56:52 40.251492 ... 1 # ... ... .. # 2020-06-08 13:07:24 40.136020 ... 1 # 2020-06-08 13:10:11 40.172526 ... 1 # 2020-06-08 13:10:41 40.125814 ... 1 # 2020-06-08 13:11:45 40.197947 ... 1 # 2020-06-08 13:14:43 40.140505 ... 1 # [645716 rows x 8 columns] #统计出911紧急拨号数据中不一样月份的电话的次数 count_by_month = df.resample("M").count()["title"] print(count_by_month.head(4) # lat # timeStamp # 2015-12-31 7916 # 2016-01-31 13096 # 2016-02-29 11396 # 2016-03-31 11059 #画图 _x = count_by_month.index _y = count_by_month.values #查看当前dataframe的方法 for i in _x: print(dir(i)) break #格式化x轴 _x = [i.strftime("%Y%m%d") for i in _x] #设置图像大小 plt.figure(figsize=(20,8),dpi=80) #绘图 plt.plot(range(len(_x)),_y) plt.xticks(range(len(_x)),_x,rotation=45) plt.xlabel("年/月/日",fontproperties=my_font) plt.ylabel("次数",fontproperties=my_font) plt.title("911紧急拨号数据中不一样月份的电话的次数",fontproperties=my_font) #设置网格 plt.grid(True,linestyle="-.",alpha=0.3) #展现 plt.show()
返回顶部ui
这里咱们运用to_datetime()函数将原来字符串类型的时间转化为了datetime类型的时间,而且制定该列数据做为索引,原有数据不保留。spa
pandas重采样;指的是将时间序列从一个频率转化为另外一个频率进行处理的过程
降采样:将高频率数据转化为低频率数据
升采样:将低频率数据转化为高频数率据.net
这里将时间频率该定为按照月进行统计。3d
在以前图形输出时横坐标包含了时间,会显得坐标冗长,视觉冲击强烈。在这里对横坐标进行格式化,只包含年月日,清晰明了。code
Python中strftime()函数的用法
在这里,strftime()函数能够用来变换时间格式,让时间更好的展示出来。
strftime()函数能够把YYYY-MM-DD HH:MM:SS格式的日期字符串转换成其它形式的字符串。xml
它能够用如下的符号对日期和时间进行格式化:
%d | 日期 | 01-31 |
---|---|---|
%f | 小数形式的秒 | SS.SSS |
%H | 小时 | 00-23 |
%j | 算出某一天是该年的第几天 | 001-366 |
%m | 月份 | 00-12 |
%M | 分钟 | 00-59 |
%s | 从1970年1月1日到如今的秒数 | |
%S | 秒 | 00-59 |
%w | 星期 | 0-6 (0是星期天) |
%W | 算出某一天属于该年的第几周 | 01-53 |
%Y | 年 | YYYY |
%% | 百分号 |
需求:统计出不一样月份的不一样类型的拨号次数的状况
import numpy as np import pandas as pd from matplotlib import pyplot as plt from matplotlib import font_manager #设置中文 my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\simfang.ttf",size=18) #读取csv文件 file_path = "911-calls/911.csv" df = pd.read_csv(file_path) #把时间字符串转化为时间类型设置为索引 df["timeStamp"] = pd.to_datetime(df["timeStamp"]) #添加列,表示分类 temp_list = df["title"].str.split(":").tolist() cate_list = [i[0] for i in temp_list] df["cate"] = pd.DataFrame(np.array(cate_list).reshape((df.shape[0]),1)) df.set_index("timeStamp",inplace=True) # 设置图像大小 plt.figure(figsize=(20, 8), dpi=80) #能够理解为对分组的数据表遍历, #设置变量group_name(分类),group_data(分组后的数据表) for group_name,group_data in df.groupby(by="cate"): #对不一样的分类进行绘图 count_by_month = group_data.resample("M").count()["title"] _x = count_by_month.index _y = count_by_month.values _x = [i.strftime("%Y/%m/%d") for i in _x] # 绘图 plt.plot(range(len(_x)), _y, label=group_name) #设置坐标及图示 plt.xticks(range(len(_x)),_x,rotation=45) plt.xlabel("年/月/日",fontproperties=my_font) plt.ylabel("911紧急拨号次数",fontproperties=my_font) plt.title("不一样月份的不一样类型的911紧急拨号次数的状况",fontproperties=my_font) plt.legend(loc="best") # 设置网格 plt.grid(True, linestyle="-.", alpha=0.3) # 展现 plt.show()
案例二的需求与案例一的需求相比较,能够发现都是对每个月的数据进行统计,只是案例二具体到了每一个911紧急拨号的类型.
基于以上的分析,以上的代码就很容易理解了。咱们首先添加date一列,同时将字符串型时间转化为时间类型并设置为索引。(详细解析见博客:pandas-分组、聚合里的911案例)
注意:
这个地方在将时间类型列设置为索引时,必须放置在df["cate"] = pd.DataFrame(np.array(cate_list).reshape((df.shape[0]),1))
以后,由于该行代码是添加一列,是在原来的dataframe结构基础上,它的索引标准仍是从0开始的;若在以前就设置时间列为索引,后续添加date列时,索引不匹配,则会出现整列为NAN值。
在案例一中咱们遍历的是统计好的每个月数据,案例二咱们要在此基础上,添加不一样的类型。一样的咱们在遍历每个月数据的同时,遍历不一样的类型。其中,每一次的遍历,就是对一种911紧急拨号类型的绘图处理。
如下是df.groupby(by=“cate”)的具体内容,因为它是个DataFrameGroupBy
object(对象),因此只能遍历的去查看。它自己是一个包含两个元素的元组,前面是类型,后面是个dataframe类型的数据,这也是为何咱们设置两个变量的缘由。
for i in df.groupby(by="cate"): print(i) <pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000024B3AFE0188> ('EMS', lat lng ... e cate 0 40.297876 -75.581294 ... 1 EMS 1 40.258061 -75.264680 ... 1 EMS 3 40.116153 -75.343513 ... 1 EMS 4 40.251492 -75.603350 ... 1 EMS 5 40.253473 -75.283245 ... 1 EMS ... ... ... .. ... 645708 40.424520 -75.526377 ... 1 EMS 645711 40.136020 -75.354606 ... 1 EMS 645712 40.172526 -75.284653 ... 1 EMS 645713 40.125814 -75.406699 ... 1 EMS 645714 40.197947 -75.533853 ... 1 EMS [322880 rows x 10 columns]) ('Fire', lat lng ... e cate 2 40.121182 -75.351975 ... 1 Fire 22 40.199006 -75.300058 ... 1 Fire 27 40.028903 -75.351822 ... 1 Fire 39 40.104206 -75.367665 ... 1 Fire 45 40.224923 -75.528045 ... 1 Fire ... ... ... .. ... 645670 40.084676 -75.168942 ... 1 Fire 645690 40.135345 -75.126997 ... 1 Fire 645706 40.161786 -75.061742 ... 1 Fire 645710 40.184228 -75.166720 ... 1 Fire 645715 40.140505 -75.310874 ... 1 Fire [97623 rows x 10 columns]) ('Traffic', lat lng ... e cate 9 40.102398 -75.291458 ... 1 Traffic 10 40.231990 -75.251891 ... 1 Traffic 11 40.084161 -75.308386 ... 1 Traffic 12 40.174131 -75.098491 ... 1 Traffic 13 40.062974 -75.135914 ... 1 Traffic ... ... ... .. ... 645700 40.116214 -75.120746 ... 1 Traffic 645701 40.285252 -75.381471 ... 1 Traffic 645702 40.184228 -75.166720 ... 1 Traffic 645705 40.072731 -75.155969 ... 1 Traffic 645709 40.002564 -75.223650 ... 1 Traffic [225213 rows x 10 columns])