• Python处理时间序列数据


    初偿用Python处理时间序列的数据,碰到一些坑。以此文记录一下,希望后来者可以少走弯路。

    背景说明:我是用一个已有的csv数据表作为原材料进行处理的。

    目的:实现时间序列的可视化,及周期性的可视化。

    1、碰到的第一个坑是,导入到时间数据,默认的是字符串的数据类型。因此,在可视化的时候,会出现没有按时间先后顺序的方式绘图的状况。

    因此,需要将字符串解析为时间类型的数据类型。

    方法1:是在读取数据的时候,采用parse_dates=True,自动解析其中的时间数据。

    方法2:使用dateuyil包中的parser.parse解析时间字符串:

    from dateutil.parser import parse
    v1 = parse('2018-09-02')
    print("解析后的时间格式为:",v1)

    方法3:利用pandas的to_datetime处理时间list

    import pandas as pd
    datestrs = ['2018/09/02','2018/09/03','2018/09/04']
    print(pd.to_datetime(datestrs))

    2、第2个坑是处理数值型数据的时候,在导入pandas下默认是object的数据类型,此时需要强制转换数据类型,但是我一直没法转换。

    出现的BUG就是:ValueError: could not convert string to float
    后来找了半天才找到原因:是数据中含有空格或者“,”才导致无法将string转为int。
    解决办法:replace(' ','').replace(',','')即替换掉其中的空格,删除其中的“,”

    3、至于后面的绘图就很简单了,唯一值得说一下的是周期性的图的绘制。

    我采用的是按“周”来绘图的,周期的固定的。实现过程看代码就好。

    4、另外需要提一下,读取文件的时候需要设置encoding = 'gbk'。默认的是utf-8,但是系统会报错。

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 # Author:Leslie Dang
     4 
     5 import numpy as np
     6 import pandas as pd
     7 import matplotlib.pyplot as plt
     8 
     9 # 01从文件导入数据
    10 data1 = pd.read_csv('01series.csv',parse_dates=True,index_col=0,encoding = 'gbk')
    11 print(data1)
    12 # print(type(data1.index))
    13 print(data1.dtypes)
    14 
    15 # 02强制转换数据类型
    16 print('***02强制转换数据类型***')
    17 
    18 # ValueError: could not convert string to float
    19 # 原因:很可能是你的数据中含有	,或者空格,或者“,”
    20 # 解决办法:replace(' ','').replace(',','')
    21 
    22 for i in range(data1['销售额'].count()):
    23     data1['销售额'][i] = data1['销售额'][i].replace(' ','').replace(',','')
    24 
    25 data1['销售额'] = data1['销售额'].astype(int)
    26 print(data1.dtypes)
    27 
    28 # 03绘图-线图
    29 print('***03绘图***')
    30 # plt.plot(data1['销售额'],label = '销售额')
    31 # plt.show()
    32 
    33 # 04绘图-周期性分析图
    34 print('***04绘图-周期性分析图***')
    35 
    36 data1 = data1.set_index('星期')
    37 print(data1)
    38 
    39 count = data1['销售额'].count()
    40 circle = count//7
    41 print(count,circle)
    42 for i in range(circle):
    43     plt.plot(data1['销售额'][7*i:7*i+7])
    44 plt.show()
    45 
    46 # 思考:如何量化周期性?采用什么参数可以表达?周期性的强度如何?

    这里补上我采用的数据源:

                星期    销售额
    日期                         
    2018-08-01  Wed  4,702,986 
    2018-08-02  Thu  5,034,151 
    2018-08-03  Fri  5,636,981 
    2018-08-04  Sat  6,377,764 
    2018-08-05  Sun  6,138,548 
    2018-08-06  Mon  5,335,273 
    2018-08-07  Tue  5,055,513 
    2018-08-08  Wed  5,159,413 
    2018-08-09  Thu  5,393,767 
    2018-08-10  Fri  5,920,339 
    2018-08-11  Sat  6,637,867 
    2018-08-12  Sun  6,292,839 
    2018-08-13  Mon  5,485,055 
    2018-08-14  Tue  5,274,536 
    2018-08-15  Wed  5,171,561 
    2018-08-16  Thu  5,269,780 
    2018-08-17  Fri  5,359,121 
    2018-08-18  Sat  6,353,952 
    2018-08-19  Sun  6,334,198 
    2018-08-20  Mon  5,577,552 
    2018-08-21  Tue  5,276,165 
    2018-08-22  Wed  5,403,919 
    2018-08-23  Thu  5,611,874 
    2018-08-24  Fri  6,073,795 
    2018-08-25  Sat  6,754,291 
    2018-08-26  Sun  6,333,426 
    2018-08-27  Mon  5,570,875 
    2018-08-28  Tue  5,327,305 
    2018-08-29  Wed  5,425,794 
  • 相关阅读:
    Caliburn.Micro代码示例
    HtmlAgilityPack解析全国区号页面到XML
    MySql避免全表扫描【转】
    jdk和tomcat环境部署
    FusionCharts ajax 调用方式
    Could not find artifact com.sun:tools:jar:1.5.0
    winform开发中绑定combox到枚举
    TextBoxButton控件的开发实现
    SendMessage函数的常用消息及其应用大全
    SqlServer2008快照隔离模式的业务应用
  • 原文地址:https://www.cnblogs.com/yimengtianya1/p/9576431.html
Copyright © 2020-2023  润新知