Python----数据分析-pandas.时间序列

Python----数据分析-pandas.时间序列


目录:

1、简单的了解生成一段时间范围
2、实际案例处理
        案例一
               案例一解析
        案例二
               案例二解析python


关于时间序列的一些基本知识点,本人了解不是太深刻,介绍一篇文章:pandas–处理时间序列数据web


在这里插入图片描述


1、简单的了解生成一段时间范围

在这里插入图片描述在这里插入图片描述

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


2、实际案例处理

案例一:

需求:统计出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


X

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

返回顶部