• 数据分析核心包——pandas


    一、pandas简介

      pandas是一个强大的Python数据分析的工具包,是基于NumPy构建的。

    1、pandas的主要功能

      (1)具备对其功能的数据结构DataFrame、Series
      (2)集成时间序列功能
      (3)提供丰富的数学运算和操作
      (4)灵活处理缺失数据

    2、安装和引用

    # 安装方法:
    # pip install pandas
    
    # 引用方法:
    import pandas as pd
    

    二、Series——一维数据对象

      Series是一种类似于一维数组的对象,由一组数据和一组与之相关的数据标签(索引)组成。

    # Series创建方式
    >>> import pandas as pd
    >>> pd.Series([2,3,4,5])
    0    2
    1    3
    2    4
    3    5
    dtype: int64
    >>> pd.Series([2,3,4,5], index=['a','b','c','d'])
    a    2
    b    3
    c    4
    d    5
    dtype: int64
    

      获取值数组和索引数组:values属性和index属性。
      Series比较像列表(数组)和字典的结合体。

    1、Series——使用特性

    (1)Series支持array的特性(下标)

    # 从ndarray创建Series:Series(arr)
    >>> import numpy as np
    >>> pd.Series(np.arange(5))
    0    0
    1    1
    2    2
    3    3
    4    4
    dtype: int64
    # 与标量运算:sr*2
    >>> sr = pd.Series([2,3,4,5], index=['a','b','c','d'])
    >>> sr
    a    2
    b    3
    c    4
    d    5
    dtype: int64
    >>> sr*2
    a     4
    b     6
    c     8
    d    10
    dtype: int64
    >>> sr+2
    a    4
    b    5
    c    6
    d    7
    dtype: int64
    # 两个Series运算:sr1+sr2
    >>> sr + sr
    a     4
    b     6
    c     8
    d    10
    dtype: int64
    # 索引:sr[0],sr[[1,2,4]]
    >>> sr[0]
    2
    >>> sr[[1,2,3]]
    b    3
    c    4
    d    5
    dtype: int64
    # 切片:sr[0:2]
    >>> sr[0:2]
    a    2
    b    3
    dtype: int64
    # 通用函数(最大值、绝对值等),如:np.abs(sr)
    >>> sr.max()
    5
    >>> np.abs(sr)
    a    2
    b    3
    c    4
    d    5
    dtype: int64 
    # 布尔值过滤:sr[sr>0]
    >>> sr>4
    a    False
    b    False
    c    False
    d     True
    dtype: bool
    >>> sr[sr>4]
    d    5
    dtype: int64
    

    (2)Series支持字典的特性(标签)

    # 从字典创建Series:Series(dic)
    >>> sr = pd.Series({'a':3, 'b':2, 'c':4})
    >>> sr
    a    3
    b    2
    c    4
    dtype: int64
    # in运算:'a' in sr
    >>> 'a' in sr
    True
    >>> 'e' in sr
    False
    >>> for i in sr:
        print(i)   # 只遍历打印值,而不是打印键
        
    3
    2
    4
    # 键索引:sr['a'], sr[['a','b','c']]
    >>> sr['a']
    3
    >>> sr[['a','b','c']]
    a    3
    b    2
    c    4
    dtype: int64
    # 获取索引对应及对应值
    >>> sr.index
    Index(['a', 'b', 'c'], dtype='object')
    >>> sr.index[0]
    'a'
    >>> sr.values
    array([1, 2, 3, 4])
    
    >>> sr = pd.Series([1,2,3,4],index=['a','b','c','d'])
    sr
    a    1
    b    2
    c    3
    d    4
    dtype: int64
    >>> sr[['a','c']]
    a    1
    c    3
    >>> sr['a':'c']  # 标签形式索引切片(前包后也包)
    a    1
    b    2
    c    3
    dtype: int64
    

    2、Series——整数索引问题

      整数索引的pandas对象往往会使新手抓狂。

    >>> sr = pd.Series(np.arange(4.))
    >>> sr
    0    0.0
    1    1.0
    2    2.0
    3    3.0
    dtype: float64
    >>> sr[-1]
    报错信息
    KeyError: -1
    >>> sr = pd.Series(np.arange(10))
    >>> sr
    0    0
    1    1
    2    2
    3    3
    4    4
    5    5
    6    6
    7    7
    8    8
    9    9
    dtype: int64
    >>> sr2 = sr[5:].copy()   # 切片后复制
    >>> sr2  # 可以看到索引还是保留之前的值
    5    5
    6    6
    7    7
    8    8
    9    9
    dtype: int64
    

      如果索引是整数类型,则根据整数进行下标获取值时总是面向标签的。(意思是说,当索引值为整数时,索引一定会解释为标签)
      解决方法:

    # loc属性:将索引解释为标签
    >>> sr2.loc[7]
    7
    
    # iloc属性:将索引解释为下标
    sr2.iloc[3]
    8
    

      因此涉及到整数的时候一定要loc和iloc指明,中括号里的索引是标签还是下标。

    3、Series——数据对齐

      pandas在进行两个Series对象的运算时,会按索引进行对齐然后计算。

    (1)Series对象运算

    >>> sr1 = pd.Series([12,23,34], index=['c','a','d'])
    >>> sr2 = pd.Series([11,20,10], index=['d','c','a'])
    >>> sr1 + sr2
    a    33     # 23+10
    c    32     # 12+20
    d    45     # 34+11
    dtype: int64
    
    >>> sr1 = pd.Series([12,23,34], index=['c','a','d'])
    >>> sr2 = pd.Series([11,20,10,21], index=['d','c','a','b'])
    >>> sr1 + sr2   # 不一样长Series相加
    a    33.0
    b     NaN   # 在pandas中用来当做数据缺失值
    c    32.0
    d    45.0
    dtype: float64
    
    >>> sr1 = pd.Series([12,23,34], index=['c','a','d'])
    >>> sr2 = pd.Series([11,20,10], index=['b','c','a'])
    >>> sr1 + sr2
    a    33.0
    b     NaN
    c    32.0
    d     NaN
    dtype: float64
    

      如果两个Series对象的索引不完全相同,则结果的索引是两个操作数索引的并集。
      如果只有一个对象在某索引下有值,则结果中该索引的值为nan(缺失值)

    (2)灵活算术方法

      灵活算术方法:add,sub,div,mul(分别对应加减乘除)。

    >>> sr1 = pd.Series([12,23,34], index=['c','a','d'])
    >>> sr2 = pd.Series([11,20,10], index=['b','c','a'])
    >>> sr1.add(sr2)
    a    33.0
    b     NaN
    c    32.0
    d     NaN
    dtype: float64
    >>> sr1.add(sr2, fill_value=0)    # 标签对应的值一个有一个没有,没有的那个赋值为0
    a    33.0
    b    11.0
    c    32.0
    d    34.0
    dtype: float64
    

    4、Series——缺失值处理

      缺失数据:使用NaN(Not a Number)来表示缺失数据。其值等于np.nan。
      内置的None值也会被当做NaN处理。

    (1)处理缺失数据的相关方法

    >>> sr = sr1+sr2
    >>> sr
    a    33.0
    b     NaN
    c    32.0
    d     NaN
    dtype: float64
    
    # dropna():过滤掉值为NaN的行
    
    # fillna():填充缺失数据
    
    # isnull():返回布尔数组,缺失值对应为True(判断是否为缺失数据)
    >>> sr.isnull()
    a    False
    b     True   # True的是NaN
    c    False
    d     True
    dtype: bool
    
    # notnull():返回布尔数组,缺失值对应为False
    sr.notnull()
    a     True
    b    False   # False对应NaN
    c     True
    d    False
    dtype: bool
    

    (2)缺失值处理方式一:过滤缺失数据

    # sr.dropna()
    >>> sr.dropna()
    a    33.0
    c    32.0
    dtype: float64
    
    # sr[data.notnull()]
    >>> sr[sr.notnull()]   # 剔除所有缺失值的行
    a    33.0
    c    32.0
    dtype: float64
    

    (3)缺失值处理方式二:填充缺失数据

    # fillna()
    >>> sr.fillna(0)   # 给缺失值赋值为0
    a    33.0
    b     0.0
    c    32.0
    d     0.0
    dtype: float64
    >>> sr.mean()     # 剔除NaN求得平均值
    32.5
    >>> sr.fillna(sr.mean())   # 给缺失值填充平均值
    a    33.0
    b    32.5
    c    32.0
    d    32.5
    dtype: float64
    

    5、Series数据对象小结

      Series是数组和字典的结合体,可以通过下标和标签来访问。
      当索引值为整数时,索引一定会解释为标签。可以使用loc和iloc来明确指明索引被解释为标签还是下标。
      如果两个Series对象的索引不完全相同,则结果的索引是两个操作数索引的并集。
      如果只有一个对象在某索引下有值,则结果中该索引的值为nan(缺失值)
      缺失数据处理方法:dropna(过滤)、fillna(填充)。

    三、DataFrame——二维数据对象

      DataFrame是一个表格式的数据结构,含有一组有序的列(即:好几列)。
      DataFrame可以被看做是由Series组成的字典,并且共用一个索引。

    # 创建方式:
    # 方法一:通过一个字典来创建
    >>> pd.DataFrame({'one':[1,2,3],'two':[4,5,6]})
       one  two
    0    1    4
    1    2    5
    2    3    6
    >>> pd.DataFrame({'one':[1,2,3],'two':[4,5,6]}, index=['a','b','c'])  # index指定行索引
       one  two
    a    1    4
    b    2    5
    c    3    6
    # 方法二:用Series来组成字典
    >>> pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['b','a','c','d'])})
       one  two
    a  1.0    2
    b  2.0    1
    c  3.0    3
    d  NaN    4
    
    # MacBook-Pro:pandas hqs$ vi test.csv   # 创建并写入csv文件
    # a,b,c
    # 1,2,3
    # 2,4,6
    # 3,6,9
    
    # csv文件读取和写入:
    >>> pd.read_csv('test.csv')    # read_csv():读取csv文件
       a  b  c
    0  1  2  3
    1  2  4  6
    2  3  6  9
    
    >>> df = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['b','a','c','d'])})
    >>> df
       one  two
    a  1.0    2
    b  2.0    1
    c  3.0    3
    d  NaN    4
    >>> df .to_csv('test2.csv')    # to_csv():写入csv文件
    
    # MacBook-Pro:pandas hqs$ vi test2.csv   # 查看csv文件,缺失的值自动为空
    # ,one,two
    # a,1.0,2
    # b,2.0,1
    # c,3.0,3
    # d,,4
    

    1、DataFrame——常用属性

    >>> df= pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['b','a','c','d'])})
    >>> df
       one  two
    a  1.0    2
    b  2.0    1
    c  3.0    3
    d  NaN    4
    
    # index:获取行索引
    >>> df.index
    Index(['a', 'b', 'c', 'd'], dtype='object')
    
    # columns:获取列索引
    >>> df.columns
    Index(['one', 'two'], dtype='object')
    
    # values:获取值数组(一般是二维数组)
    >>> df.values
    array([[ 1.,  2.],
           [ 2.,  1.],
           [ 3.,  3.],
           [nan,  4.]])
    
    # T:转置
    >>> df
       one  two
    a  1.0    2
    b  2.0    1
    c  3.0    3
    d  NaN    4
    >>> df.T      # 行变成列,列变成行
           a    b    c    d
    one  1.0  2.0  3.0  NaN
    two  2.0  1.0  3.0  4.0
    
    # describe():获取快速统计
    >>> df.describe()
           one       two
    count  3.0  4.000000    # 统计每一列个数
    mean   2.0  2.500000    # 统计每一列平均数
    std    1.0  1.290994    # 统计每一列标准差
    min    1.0  1.000000    # 统计每一列最小值
    25%    1.5  1.750000    # 1/4位上的数
    50%    2.0  2.500000    # 1/2位上的数
    75%    2.5  3.250000    # 3/4位上的数
    max    3.0  4.000000    # 统计每一列最大值
    

    2、DataFrame——索引和切片

      DataFrame是一个二维数据类型,所以有行索引和列索引。

    >>> df
       one  two
    a  1.0    2
    b  2.0    1
    c  3.0    3
    d  NaN    4
    >>> df['one']['a']   # 先列后行,一列是一个Series
    1.0
    

      DataFrame同样可以通过标签位置两种方法进行索引和切片
      loc属性和iloc属性:loc是按索引选取数据,iloc是按位置(下标)选取数据。

    # 使用方法:逗号隔开,前面是行索引,后面是列索引
    >>> df.loc['a','one']    # 先行后列
    1.0
    
    # 行/列索引部分可以是常规索引、切片、布尔值索引、花式索引任意搭配
    >>> df.loc['a',:]   # 选择a这一行,列选择全部
    one    1.0
    two    2.0
    Name: a, dtype: float64
    >>> df.loc['a',]    # 效果同上
    one    1.0
    two    2.0
    Name: a, dtype: float64
    
    >>> df.loc[['a','c'],:]  # 选择a、c这两行,列选择全部
       one  two
    a  1.0    2
    c  3.0    3
    >>> df.loc[['a','c'],'two']
    a    2
    c    3
    Name: two, dtype: int64
    
    >>> df.apply(lambda x:x+1)
       one  two
    a  2.0    3
    b  3.0    2
    c  4.0    4
    d  NaN    5
    >>> df.apply(lambda x:x.mean())
    one    2.0
    two    2.5
    dtype: float64
    

    3、DataFrame——数据对齐和缺失数据处理

      DataFrame对象在运算时,同样会进行数据对齐,其行索引和列索引分别对齐。

    >>> df = pd.DataFrame({'two':[1,2,3,4],'one':[4,5,6,7]}, index=['c','d','b','a'])
    >>> df2 = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['b','a','c','d'])})
    >>> df
       two  one
    c    1    4
    d    2    5
    b    3    6
    a    4    7
    >>> df2
       one  two
    a  1.0    2
    b  2.0    1
    c  3.0    3
    d  NaN    4
    >>> df + df2
       one  two
    a  8.0    6
    b  8.0    4
    c  7.0    4
    d  NaN    6
    

      DataFrame处理缺失数据的相关方法:

    # df.fillna(x):用x替换DataFrame对象中所有的空值
    >>> df2.fillna(0)
       one  two
    a  1.0    2
    b  2.0    1
    c  3.0    3
    d  0.0    4
    
    >>> df2.loc['d','two']=np.nan    # 给df2修改添加缺失值
    >>> df2.loc['c','two']=np.nan
    >>> df2
       one  two
    a  1.0  2.0
    b  2.0  1.0
    c  3.0  NaN
    d  NaN  NaN
    
    # df.dropna():删除所有包含空值的行,how的默认参数是any
    >>> df2.dropna()
       one  two
    a  1.0  2.0
    b  2.0  1.0
    >>> df2.dropna(how='all')   # 删除所有值都为缺失值的行,how的默认参数是any
       one  two
    a  1.0  2.0
    b  2.0  1.0
    c  3.0  NaN
    >>> df2.dropna(how='any')
       one  two
    a  1.0  2.0
    b  2.0  1.0
    
    # df.dropna(axis=1):删除所有包含空值的列,axis(轴)默认是0
    >>> df.loc['c','one']=np.nan    # 给df修改添加缺失值
    >>> df
       two  one
    c    1  NaN
    d    2  5.0
    b    3  6.0
    a    4  7.0
    >>> df.dropna(axis=1)
       two
    c    1
    d    2
    b    3
    a    4
    
    # df.dropna(axis=1,thresh=n):删除所有小于n个非空值的行 
    >>> df.dropna(axis=1, thresh=4)
       two
    c    1
    d    2
    b    3
    a    4
    
    # df.isnull():检查DataFrame对象中的空值,并返回一个Boolean数组
    >>> df2.isnull()
         one    two
    a  False  False
    b  False  False
    c  False   True
    d   True   True
    
    # df.notnull():检查DataFrame对象中的非空值,并返回一个Boolean数组
    >>> df2.notnull()
         one    two
    a   True   True
    b   True   True
    c   True  False
    d  False  False
    

    四、pandas常用函数(方法)

    >>> df
       two  one
    c    1  NaN
    d    2  5.0
    b    3  6.0
    a    4  7.0
    
    # mean(axis=0,skipna=False):对列(行)求平均值
    >>> df.mean()         # 忽略缺失值,默认对每一列求平均值
    two    2.5
    one    6.0
    dtype: float64
    >>> df.mean(axis=1)   # 忽略缺失值,对每一行求平均值
    c    1.0
    d    3.5
    b    4.5
    a    5.5
    dtype: float64
    
    # sum(axis=1):对列(行)求和
    >>> df.sum()          # 对每一列求和
    two    10.0
    one    18.0
    dtype: float64
    >>> df.sum(axis=1)    # 对每一行求和
    c     1.0
    d     7.0
    b     9.0
    a    11.0
    dtype: float64
    
    # sort_index(axis,...,ascending):对列(行)索引排序
    >>> df.sort_index()        # 默认对列索引升序排列
       two  one
    a    4  7.0
    b    3  6.0
    c    1  NaN
    d    2  5.0
    >>> df.sort_index(ascending=False)   # 对列索引降序排列
       two  one
    d    2  5.0
    c    1  NaN
    b    3  6.0
    a    4  7.0
    >>> df.sort_index(axis=1)      # 对行索引升序排列
       one  two      # o排在t前面
    c  NaN    1
    d  5.0    2
    b  6.0    3
    a  7.0    4
    >>> df.sort_index(ascending=False,axis=1)   # 对行索引降序排列
       two  one
    c    1  NaN
    d    2  5.0
    b    3  6.0
    a    4  7.0
    
    # sort_values(by,axis,ascending):按某一列(行)的值排序
    >>> df.sort_values(by='two')   # 按two这一列排序
       two  one
    c    1  NaN
    d    2  5.0
    b    3  6.0
    a    4  7.0
    >>> df.sort_values(by='two', ascending=False)   # ascending默认升序,改为False即为降序
       two  one
    a    4  7.0
    b    3  6.0
    d    2  5.0
    c    1  NaN
    >>> df.sort_values(by='a',ascending=False,axis=1)  # 按a行降序排序,注意是按值排序
       one  two
    c  NaN    1
    d  5.0    2
    b  6.0    3
    a  7.0    4
    # 按列排序,有缺失值的默认放在最后
    >>> df.sort_values(by='one')
       two  one
    d    2  5.0
    b    3  6.0
    a    4  7.0
    c    1  NaN
    >>> df.sort_values(by='one', ascending=False)
       two  one
    a    4  7.0
    b    3  6.0
    d    2  5.0
    c    1  NaN
    

      注意:NumPy的通用函数同样适用于pandas

    五、pandas——时间序列处理

      时间序列类型:
      (1)时间戳:特定时刻
      (2)固定时期:如2017年7月
      (3)时间间隔:起始时间——结束时间

    1、时间对象处理

      python标准库处理时间对象:datetime模块。datetime模块的datetime类中有一个方法strptime(),可以将字符串解析为时间对象。

    >>> import datetime
    >>> datetime.datetime.strptime('2010-01-01', '%Y-%m-%d')
    datetime.datetime(2010, 1, 1, 0, 0)
    

    (1)灵活处理时间对象——dateutil

    >>> import dateutil
    >>> dateutil.parser.parse('2001-01-01')    # 用-分隔
    datetime.datetime(2001, 1, 1, 0, 0)
    >>> dateutil.parser.parse('2001/01/01')    # 用/分隔
    datetime.datetime(2001, 1, 1, 0, 0)
    >>> dateutil.parser.parse('02/03/2001')    # 年份放在后面也可以识别
    datetime.datetime(2001, 2, 3, 0, 0)
    >>> dateutil.parser.parse('2001-JAN-01')   # 识别英文月份
    datetime.datetime(2001, 1, 1, 0, 0)
    

    (2)成组处理时间对象——pandas

      通常被用来做索引。

    >>> pd.to_datetime(['2001-01-01','2010/Feb/02'])   # 不同格式均自动转化为DatetimeIndex
    DatetimeIndex(['2001-01-01', '2010-02-02'], dtype='datetime64[ns]', freq=None)
    

    2、时间对象生成

      pandas中date_range函数如下所示:

    def date_range(start=None, end=None, periods=None, freq=None, tz=None,
                   normalize=False, name=None, closed=None, **kwargs):
        """
        Return a fixed frequency DatetimeIndex.
    
        Parameters
        ----------
        start : str or datetime-like, optional    开始时间
            Left bound for generating dates.
        end : str or datetime-like, optional      结束时间
            Right bound for generating dates.
        periods : integer, optional               时间长度
            Number of periods to generate.
        freq : str or DateOffset, default 'D'     时间频率,默认为'D',可选H(our),W(eek),B(usiness),S(emi-)M(onth),(min)T(es),S(econd),A(years),...
            Frequency strings can have multiples, e.g. '5H'. See
            :ref:`here <timeseries.offset_aliases>` for a list of
            frequency aliases.
        tz : str or tzinfo, optional
            Time zone name for returning localized DatetimeIndex, for example
            'Asia/Hong_Kong'. By default, the resulting DatetimeIndex is
            timezone-naive.
        normalize : bool, default False
            Normalize start/end dates to midnight before generating date range.
        name : str, default None
            Name of the resulting DatetimeIndex.
        closed : {None, 'left', 'right'}, optional
            Make the interval closed with respect to the given frequency to
            the 'left', 'right', or both sides (None, the default).
        **kwargs
            For compatibility. Has no effect on the result.
        """
    

      使用示例如下所示:

    >>> pd.date_range('2010-01-01','2010-5-1')                    # 设置起始时间和结束时间
    DatetimeIndex(['2010-01-01', '2010-01-02', '2010-01-03', '2010-01-04',
                   '2010-01-09', '2010-01-10',
                   ...
                   '2010-04-26', '2010-04-27', '2010-04-28', '2010-04-29',
                   '2010-04-30', '2010-05-01'],
                  dtype='datetime64[ns]', length=121, freq='D')
    
    >>> pd.date_range('2010-01-01', periods=10)                   # 指定起始和长度
    DatetimeIndex(['2010-01-01', '2010-01-02', '2010-01-03', '2010-01-04',
                   '2010-01-05', '2010-01-06', '2010-01-07', '2010-01-08',
                   '2010-01-09', '2010-01-10'],
                  dtype='datetime64[ns]', freq='D')
    
    >>> pd.date_range('2010-01-01', periods=10, freq='H')         # 指定频率为每小时
    DatetimeIndex(['2010-01-01 00:00:00', '2010-01-01 01:00:00',
                   '2010-01-01 02:00:00', '2010-01-01 03:00:00',
                   '2010-01-01 04:00:00', '2010-01-01 05:00:00',
                   '2010-01-01 06:00:00', '2010-01-01 07:00:00',
                   '2010-01-01 08:00:00', '2010-01-01 09:00:00'],
                  dtype='datetime64[ns]', freq='H')
    
    >>> pd.date_range('2010-01-01', periods=10, freq='W-MON')     # 指定频率为每周一
    DatetimeIndex(['2010-01-04', '2010-01-11', '2010-01-18', '2010-01-25',
                   '2010-02-01', '2010-02-08', '2010-02-15', '2010-02-22',
                   '2010-03-01', '2010-03-08'],
                  dtype='datetime64[ns]', freq='W-MON')
    
    >>> pd.date_range('2010-01-01', periods=10, freq='B')         # 指定频率为工作日
    DatetimeIndex(['2010-01-01', '2010-01-04', '2010-01-05', '2010-01-06',
                   '2010-01-07', '2010-01-08', '2010-01-11', '2010-01-12',
                   '2010-01-13', '2010-01-14'],
                  dtype='datetime64[ns]', freq='B')
    
    >>> pd.date_range('2010-01-01', periods=10, freq='1h20min')   # 间隔一小时二十分钟
    DatetimeIndex(['2010-01-01 00:00:00', '2010-01-01 01:20:00',
                   '2010-01-01 02:40:00', '2010-01-01 04:00:00',
                   '2010-01-01 05:20:00', '2010-01-01 06:40:00',
                   '2010-01-01 08:00:00', '2010-01-01 09:20:00',
                   '2010-01-01 10:40:00', '2010-01-01 12:00:00'],
                  dtype='datetime64[ns]', freq='80T')
    
    # 转换为datetime对象
    >>> dt = pd.date_range('2010-01-01', periods=10, freq='B')
    >>> dt[0]
    Timestamp('2010-01-01 00:00:00', freq='B')
    >>> dt[0].to_pydatetime()    # 转换为python的datetime对象
    datetime.datetime(2010, 1, 1, 0, 0)
    

    3、pandas——时间序列

      时间序列就是以时间对象作为索引SeriesDataFrame
      datetime对象作为索引时是存储在DatetimeIndex对象中的。
      时间序列的特殊功能:

    >>> sr = pd.Series(np.arange(1000),index=pd.date_range('2017-01-01', periods=1000))
    >>> sr
    2017-01-01      0
    2017-01-02      1
    2017-01-03      2
    2017-01-04      3
    ...
    2019-09-26    998
    2019-09-27    999
    Freq: D, Length: 1000, dtype: int64
    
    # 功能一:传入"年"或"年月"作为切片方式
    >>> sr['2017']      # 传入年切片
    2017-01-01      0
    2017-01-02      1
    ...
    2017-12-30    363
    2017-12-31    364
    Freq: D, Length: 365, dtype: int64
    >>> sr['2017-05']   # 传入年月切片               
    2017-05-01    120
    2017-05-02    121
    ...
    2017-05-30    149
    2017-05-31    150
    Freq: D, dtype: int64
    
    # 功能二:传入日期范围作为切片方式
    >>> sr['2017-10-25':'2018-03']   # 2017年10月25日到2018年3月
    2017-10-25    297
    2017-10-26    298
    ...
    2018-03-30    453
    2018-03-31    454
    Freq: D, Length: 158, dtype: int64
    
    # 功能三:丰富的函数支持:resample()、truncate()....
    # resample()重新采样函数
    >>> sr.resample('W').sum()   # 每一周的合
    2017-01-01       0
    2017-01-08      28
    ...
    2019-09-22    6937
    2019-09-29    4985
    Freq: W-SUN, Length: 144, dtype: int64
    >>> sr.resample('M').sum()   # 每个月的合
    2017-01-31      465
    2017-02-28     1246
    ...
    2019-08-31    29667
    2019-09-30    26622
    Freq: M, dtype: int64
    >>> sr.resample('M').mean()   # 每个月每天的平均值
    2017-01-31     15.0
    2017-02-28     44.5
    2017-03-31     74.0
    ...
    2019-08-31    957.0
    2019-09-30    986.0
    Freq: M, dtype: float64
    
    # truncate()截断
    >>> sr.truncate(before='2018-04-01')   # 截断掉2018年4月1日之前的部分
    2018-04-01    455
    2018-04-02    456
    ...
    2019-09-26    998
    2019-09-27    999
    Freq: D, Length: 545, dtype: int64
    >>> sr.truncate(after='2018-01-01')    # 截断掉2018年1月1日之后的部分
    2017-01-01      0
    2017-01-02      1
    2017-01-03      2
    ...
    2017-12-31    364
    2018-01-01    365
    Freq: D, Length: 366, dtype: int64
    

    六、pandas——文件处理

      数据文件常用格式:csv(以某间隔符分隔数据)。
      pandas除了支持csv格式,还支持其他文件类型如:json、XML、HTML、数据库、pickle、excel....

    1、pandas读取文件

      从文件名、URL、文件对象中加载数据。

    (1)read_csv:默认分隔符为逗号

    >>> pd.read_csv('601318.csv')   # 将原来的索引标识为unnamed,重新生成一列索引
          Unnamed: 0        date    open  ...     low      volume    code
    0              0  2007-03-01  21.878  ...  20.040  1977633.51  601318
    1              1  2007-03-02  20.565  ...  20.075   425048.32  601318
    2              2  2007-03-05  20.119  ...  19.047   419196.74  601318
              ...         ...     ...  ...     ...         ...     ...
    2561        2561  2017-12-14  72.120  ...  70.600   676186.00  601318
    2562        2562  2017-12-15  70.690  ...  70.050   735547.00  601318
    [2563 rows x 8 columns]
    >>> pd.read_csv('601318.csv',index_col=0)   # 将第0列作为索引
                date    open   close    high     low      volume    code
    0     2007-03-01  21.878  20.473  22.302  20.040  1977633.51  601318
    1     2007-03-02  20.565  20.307  20.758  20.075   425048.32  601318
              ...     ...     ...     ...     ...         ...     ...
    2561  2017-12-14  72.120  71.010  72.160  70.600   676186.00  601318
    2562  2017-12-15  70.690  70.380  71.440  70.050   735547.00  601318
    [2563 rows x 7 columns]
    >>> pd.read_csv('601318.csv',index_col='date')   # 将date那一列作为索引
                Unnamed: 0    open   close    high     low      volume    code
    date                                                                      
    2007-03-01           0  21.878  20.473  22.302  20.040  1977633.51  601318
    2007-03-02           1  20.565  20.307  20.758  20.075   425048.32  601318
                    ...     ...     ...     ...     ...         ...     ...
    2017-12-14        2561  72.120  71.010  72.160  70.600   676186.00  601318
    2017-12-15        2562  70.690  70.380  71.440  70.050   735547.00  601318
    [2563 rows x 7 columns]
    
    # 需要注意:上面虽然是有时间日期作为索引,但实际不是时间对象而是字符串
    >>> df = pd.read_csv('601318.csv',index_col='date')
    >>> df.index
    Index(['2007-03-01', '2007-03-02', '2007-03-05', '2007-03-06', '2007-03-07',
           '2007-03-08', '2007-03-09', '2007-03-12', '2007-03-13', '2007-03-14',
           ...
           '2017-12-04', '2017-12-05', '2017-12-06', '2017-12-07', '2017-12-08',
           '2017-12-11', '2017-12-12', '2017-12-13', '2017-12-14', '2017-12-15'],
          dtype='object', name='date', length=2563)
    
    # 转换为时间对象的方法:
    # 方法一:
    >>> df = pd.read_csv('601318.csv',index_col='date', parse_dates=True)  # 解释表中所有能解释为时间序列的列
    >>> df
                Unnamed: 0    open   close    high     low      volume    code
    date                                                                      
    2007-03-01           0  21.878  20.473  22.302  20.040  1977633.51  601318
    2007-03-02           1  20.565  20.307  20.758  20.075   425048.32  601318
                    ...     ...     ...     ...     ...         ...     ...
    2017-12-14        2561  72.120  71.010  72.160  70.600   676186.00  601318
    2017-12-15        2562  70.690  70.380  71.440  70.050   735547.00  601318
    [2563 rows x 7 columns]
    >>> df.index   # 查看索引,可以发现已转换为Datetime
    DatetimeIndex(['2007-03-01', '2007-03-02', '2007-03-05', '2007-03-06',
                   '2007-03-07', '2007-03-08', '2007-03-09', '2007-03-12',
                   ...
                   '2017-12-08', '2017-12-11', '2017-12-12', '2017-12-13',
                   '2017-12-14', '2017-12-15'],
                  dtype='datetime64[ns]', name='date', length=2563, freq=None)
    # 方法二:
    >>> df = pd.read_csv('601318.csv',index_col='date', parse_dates=['date'])  # parse_dates也可以传列表,指定哪些列转换
    >>> df.index
    DatetimeIndex(['2007-03-01', '2007-03-02', '2007-03-05', '2007-03-06',
                   '2007-03-07', '2007-03-08', '2007-03-09', '2007-03-12',
                   ...
                   '2017-12-08', '2017-12-11', '2017-12-12', '2017-12-13',
                   '2017-12-14', '2017-12-15'],
                  dtype='datetime64[ns]', name='date', length=2563, freq=None)
    
    # header参数为None:指定文件无列名,可自动生成数字列名
    >>> pd.read_csv('601318.csv',header=None)
               0           1       2       3       4       5           6       7   # 新列名
    0        NaN        date    open   close    high     low      volume    code
    1        0.0  2007-03-01  21.878  20.473  22.302   20.04  1977633.51  601318
    2        1.0  2007-03-02  20.565  20.307  20.758  20.075   425048.32  601318
          ...         ...     ...     ...     ...     ...         ...     ...
    2562  2561.0  2017-12-14   72.12   71.01   72.16    70.6    676186.0  601318
    2563  2562.0  2017-12-15   70.69   70.38   71.44   70.05    735547.0  601318
    [2564 rows x 8 columns]
    
    # 还可用names参数指定列名
    >>> pd.read_csv('601318.csv',header=None, names=list('abcdefgh'))
               a           b       c       d       e       f           g       h
    0        NaN        date    open   close    high     low      volume    code
    1        0.0  2007-03-01  21.878  20.473  22.302   20.04  1977633.51  601318
    2        1.0  2007-03-02  20.565  20.307  20.758  20.075   425048.32  601318
          ...         ...     ...     ...     ...     ...         ...     ...
    2562  2561.0  2017-12-14   72.12   71.01   72.16    70.6    676186.0  601318
    2563  2562.0  2017-12-15   70.69   70.38   71.44   70.05    735547.0  601318
    [2564 rows x 8 columns]
    

    (2)read_table:默认分隔符为制表符

      read_table使用方法和read_csv基本相同。

    (3)read_csv、read_table函数主要参数

    # sep:指定分隔符,可用正则表达式如's+'
    
    # header=None:指定文件无列名
    
    # name:指定列名
    
    # index_col:指定某里列作为索引
    
    # skip_row:指定跳过某些行
    >>> pd.read_csv('601318.csv',header=None, skiprows=[1,2,3])   # 跳过123这三行
               0           1       2       3       4       5          6       7
    0        NaN        date    open   close    high     low     volume    code
    1        3.0  2007-03-06  19.253    19.8  20.128  19.143  297727.88  601318
    2        4.0  2007-03-07  19.817  20.338  20.522  19.651  287463.78  601318
    3        5.0  2007-03-08  20.171  20.093  20.272  19.988  130983.83  601318
          ...         ...     ...     ...     ...     ...        ...     ...
    2559  2561.0  2017-12-14   72.12   71.01   72.16    70.6   676186.0  601318
    2560  2562.0  2017-12-15   70.69   70.38   71.44   70.05   735547.0  601318
    [2561 rows x 8 columns]
    
    # na_values:指定某些字符串表示缺失值
    # 如果某些值是NaN能识别是缺失值,但如果是None则识别为字符串
    >>> pd.read_csv('601318.csv',header=None, na_values=['None'])   # 将None字符串解释为缺失值
               0           1       2       3       4       5           6       7
    0        NaN        date    open   close    high     low      volume    code
    1        0.0  2007-03-01  21.878     NaN  22.302   20.04  1977633.51  601318
    2        1.0  2007-03-02  20.565     NaN  20.758  20.075   425048.32  601318
          ...         ...     ...     ...     ...     ...         ...     ...
    2561  2560.0  2017-12-13   71.21   72.12   72.62    70.2    865117.0  601318
    2562  2561.0  2017-12-14   72.12   71.01   72.16    70.6    676186.0  601318
    2563  2562.0  2017-12-15   70.69   70.38   71.44   70.05    735547.0  601318
    [2564 rows x 8 columns]
    
    # parse_dates:指定某些列是否被解析为日期,类型为布尔值或列表
    
    

    2、pandas写入csv文件

      写入到csv文件:to_csv函数。

    >>> df = pd.read_csv('601318.csv',index_col=0)
    >>> df.iloc[0,0]=np.nan     # 第0行第0列改为NaN
    
    # 写入新文件
    >>> df.to_csv('test.csv')
    
    # 写入文件函数的主要参数
    # sep:指定文件分隔符
    
    # header=False:不输出列名一行
    >>> df.to_csv('test.csv', header=False)
    
    # index=False:不输出行索引一行
    >>> df.to_csv('test.csv', index=False)
    
    # na_rep:指定缺失值转换的字符串,默认为空字符串
    >>> df.to_csv('test.csv', header=False, index=False, na_rep='null')   # 空白处填写null
    
    # columns:指定输出的列,传入列表
    >>> df.to_csv('test.csv', header=False, index=False, na_rep='null', columns=[0,1,2,3])  # 输出前四列
    

    3、pandas写入及读取其他格式文件

    >>> df.to_html('test.html')   # 以html格式写入文件
    
    >>> df.to_json('test.json')   # 以json格式写入文件
    
    >>> pd.read_json('test.json')   # 读取json格式文件
          Unnamed: 0       date    open   close    high     low      volume    code
    0              0 2007-03-01  21.878    None  22.302  20.040  1977633.51  601318
    1              1 2007-03-02  20.565    None  20.758  20.075   425048.32  601318
              ...        ...     ...     ...     ...     ...         ...     ...
    998          998 2011-07-07  22.438  21.985  22.465  21.832   230480.00  601318
    999          999 2011-07-08  22.076  21.936  22.212  21.850   141415.00  601318
    [2563 rows x 8 columns]
    
    >>> pd.read_html('test.html')   # 读取html格式文件
    [      Unnamed: 0  Unnamed: 0.1        date  ...     low      volume    code
    0              0             0  2007-03-01  ...  20.040  1977633.51  601318
    1              1             1  2007-03-02  ...  20.075   425048.32  601318
              ...           ...         ...  ...     ...         ...     ...
    2561        2561          2561  2017-12-14  ...  70.600   676186.00  601318
    2562        2562          2562  2017-12-15  ...  70.050   735547.00  601318
    [2563 rows x 9 columns]]
    
  • 相关阅读:
    Windows下使用Visual Studio Code搭建Go语言环境
    无缓冲和带缓冲channel的区别
    Asp.Net MVC如何返回401响应码
    从这里开始我的博客园
    java判定字符串中仅有数字和- 正则表达式匹配 *** 最爱那水货
    主席树
    Mybitis+springMVC 套路
    jeeplus ani 文档路径
    jquery easyui datagrid 多选只能获取一条数据
    python写入文件编码报错
  • 原文地址:https://www.cnblogs.com/xiugeng/p/10356163.html
Copyright © 2020-2023  润新知