• Pandas 基础(15)


    这一节是承接上一节的内容, 依然是基于时间的数据分析, 接下来带大家理解关于 date_range 的相关用法.

    首先, 引入数据文件:

    import pandas as pd
    df = pd.read_csv('/Users/rachel/Sites/pandas/py/pandas/15_ts_date_range/aapl_no_dates.csv')
    df.head()
    

    输出:

    这个文件的数据跟上一节用到的数据是一模一样的(大家可以对照一下), 只是时间列被去掉了. 这样设计是因为我们要引出下面要学到的函数 date_range(), 我们可以通过这个函数把缺少的时间列补上.

    设定一个时间范围:

    rng = pd.date_range(start='6/1/2017', end='6/30/2017', freq='B')
    rng
    

    输出:

    DatetimeIndex(['2017-06-01', '2017-06-02', '2017-06-05', '2017-06-06',
                   '2017-06-07', '2017-06-08', '2017-06-09', '2017-06-12',
                   '2017-06-13', '2017-06-14', '2017-06-15', '2017-06-16',
                   '2017-06-19', '2017-06-20', '2017-06-21', '2017-06-22',
                   '2017-06-23', '2017-06-26', '2017-06-27', '2017-06-28',
                   '2017-06-29', '2017-06-30'],
                  dtype='datetime64[ns]', freq='B')
    

    这里对 date_range() 函数一共设置了 3个参数, 前两个很好理解, 分别是开始时间, 结束时间, 最后一个 freq 是关于连续性的设定, 它有几种选择, B 的意思是 business, 也就是只取工作日, 大家可以根据输出结果, 对照着日历看下, 刚好就是省略了周末. 

    那下面就可以把上面得到的日期序列设为我们数据的索引列, 这个很简答了, 是 pandas 的基础操作:

    df.set_index(rng, inplace=True)
    

    输出: 

    现在我们的数据表完整了, 有了时间列索引, 我们就可以轻松对数据做很多分析操作了:

    求曲线图:

    %matplotlib inline
    df.Close.plot()
    

    输出:

    求6月1日到6月10日的数据:

    df['2017-6-1':'2017-6-10']
    

    输出:

    求6月1日到6月10日的闭市数据的平均值:

    df['2017-6-1':'2017-6-10'].Close.mean()
    

    输出:

    153.7642857142857
    

    再介绍 date_range() 的另一种设置时间范围的方法:
    设置一个时间序列, 参数说明:
    start: 起始日期
    periods: 从起始值开始向后顺延的数据条数, 单位取决于第三个数 freq
    freq: 连续的方式, B 表示只取工作日

    rng = pd.date_range(start='1/1/2017', periods=72, freq='B')
    rng
    

    输出:

    DatetimeIndex(['2017-01-02', '2017-01-03', '2017-01-04', '2017-01-05',
                   '2017-01-06', '2017-01-09', '2017-01-10', '2017-01-11',
                   '2017-01-12', '2017-01-13', '2017-01-16', '2017-01-17',
                   '2017-01-18', '2017-01-19', '2017-01-20', '2017-01-23',
                   '2017-01-24', '2017-01-25', '2017-01-26', '2017-01-27',
                   '2017-01-30', '2017-01-31', '2017-02-01', '2017-02-02',
                   '2017-02-03', '2017-02-06', '2017-02-07', '2017-02-08',
                   '2017-02-09', '2017-02-10', '2017-02-13', '2017-02-14',
                   '2017-02-15', '2017-02-16', '2017-02-17', '2017-02-20',
                   '2017-02-21', '2017-02-22', '2017-02-23', '2017-02-24',
                   '2017-02-27', '2017-02-28', '2017-03-01', '2017-03-02',
                   '2017-03-03', '2017-03-06', '2017-03-07', '2017-03-08',
                   '2017-03-09', '2017-03-10', '2017-03-13', '2017-03-14',
                   '2017-03-15', '2017-03-16', '2017-03-17', '2017-03-20',
                   '2017-03-21', '2017-03-22', '2017-03-23', '2017-03-24',
                   '2017-03-27', '2017-03-28', '2017-03-29', '2017-03-30',
                   '2017-03-31', '2017-04-03', '2017-04-04', '2017-04-05',
                   '2017-04-06', '2017-04-07', '2017-04-10', '2017-04-11'],
                  dtype='datetime64[ns]', freq='B')
    

    这里就得到了从1月2日开始的72个日期, 这其中是跳过了周末的日期之后, 总共加起来是72天.

    下面把第三个参数改下, freq=H, 也就是以小时为单位, 从起始开始, 取72小时:

    rng = pd.date_range(start='1/1/2017', periods=72, freq='H')
    rng
    

    输出:

    DatetimeIndex(['2017-01-01 00:00:00', '2017-01-01 01:00:00',
                   '2017-01-01 02:00:00', '2017-01-01 03:00:00',
                   '2017-01-01 04:00:00', '2017-01-01 05:00:00',
                   '2017-01-01 06:00:00', '2017-01-01 07:00:00',
                   '2017-01-01 08:00:00', '2017-01-01 09:00:00',
                   '2017-01-01 10:00:00', '2017-01-01 11:00:00',
                   '2017-01-01 12:00:00', '2017-01-01 13:00:00',
                   '2017-01-01 14:00:00', '2017-01-01 15:00:00',
                   '2017-01-01 16:00:00', '2017-01-01 17:00:00',
                   '2017-01-01 18:00:00', '2017-01-01 19:00:00',
                   '2017-01-01 20:00:00', '2017-01-01 21:00:00',
                   '2017-01-01 22:00:00', '2017-01-01 23:00:00',
                   '2017-01-02 00:00:00', '2017-01-02 01:00:00',
                   '2017-01-02 02:00:00', '2017-01-02 03:00:00',
                   '2017-01-02 04:00:00', '2017-01-02 05:00:00',
                   '2017-01-02 06:00:00', '2017-01-02 07:00:00',
                   '2017-01-02 08:00:00', '2017-01-02 09:00:00',
                   '2017-01-02 10:00:00', '2017-01-02 11:00:00',
                   '2017-01-02 12:00:00', '2017-01-02 13:00:00',
                   '2017-01-02 14:00:00', '2017-01-02 15:00:00',
                   '2017-01-02 16:00:00', '2017-01-02 17:00:00',
                   '2017-01-02 18:00:00', '2017-01-02 19:00:00',
                   '2017-01-02 20:00:00', '2017-01-02 21:00:00',
                   '2017-01-02 22:00:00', '2017-01-02 23:00:00',
                   '2017-01-03 00:00:00', '2017-01-03 01:00:00',
                   '2017-01-03 02:00:00', '2017-01-03 03:00:00',
                   '2017-01-03 04:00:00', '2017-01-03 05:00:00',
                   '2017-01-03 06:00:00', '2017-01-03 07:00:00',
                   '2017-01-03 08:00:00', '2017-01-03 09:00:00',
                   '2017-01-03 10:00:00', '2017-01-03 11:00:00',
                   '2017-01-03 12:00:00', '2017-01-03 13:00:00',
                   '2017-01-03 14:00:00', '2017-01-03 15:00:00',
                   '2017-01-03 16:00:00', '2017-01-03 17:00:00',
                   '2017-01-03 18:00:00', '2017-01-03 19:00:00',
                   '2017-01-03 20:00:00', '2017-01-03 21:00:00',
                   '2017-01-03 22:00:00', '2017-01-03 23:00:00'],
                  dtype='datetime64[ns]', freq='H')
    

    上面介绍了关于生成日期序列的函数 date_range() 的用法. 

    下面介绍一下日期序列的补充函数 asfreq(). 在上面的例子中, 数据里缺少了周末的数据, 所以如果想要补充这部分数据的话, 可以用下面的方式. 上面的代码中, 参数 D 表示以"天"为单位, 连续取值:

    df.asfreq('D', method='pad')
    

    输出:

    参数 W 表示以"周"为单位, 连续取值:

    df.asfreq('W', method='pad')
    

    输出:

    参数 H 表示以"小时"为单位, 连续取值:

    df.asfreq('H', method='pad')
    

    输出:

    在 1 到10范围内取72个随机数:

    import numpy as np
    np.random.randint(1,10,len(rng))
    

    输出:

    array([1, 2, 5, 6, 6, 5, 9, 8, 3, 2, 5, 8, 9, 4, 5, 4, 9, 9, 4, 9, 9, 8,
           5, 3, 2, 8, 3, 9, 8, 7, 8, 4, 8, 8, 8, 4, 4, 5, 1, 1, 3, 8, 3, 2,
           9, 6, 5, 8, 2, 7, 5, 7, 5, 1, 5, 6, 6, 3, 4, 4, 4, 3, 5, 3, 3, 9,
           1, 2, 8, 7, 9, 6])
    

    把上面的 72 个数生成一个序列, 以上面的时间序列为索引:

    ts=pd.Series(np.random.randint(1,10,len(rng)), index=rng)
    ts.head(10)
    

    输出:

    2017-01-01 00:00:00    7
    2017-01-01 01:00:00    9
    2017-01-01 02:00:00    4
    2017-01-01 03:00:00    3
    2017-01-01 04:00:00    3
    2017-01-01 05:00:00    8
    2017-01-01 06:00:00    7
    2017-01-01 07:00:00    8
    2017-01-01 08:00:00    2
    2017-01-01 09:00:00    2
    Freq: H, dtype: int64
    

    以上是关于时间序列的第二小节, 下节会继续哦, enjoy~~~~

  • 相关阅读:
    bzoj 3779: 重组病毒【LCT+线段树维护dfs序】
    bzoj 4817: [Sdoi2017]树点涂色【树链剖分+LCT】
    bzoj 4818: [Sdoi2017]序列计数【容斥原理+dp+矩阵乘法】
    bzoj 1853: [Scoi2010]幸运数字&&2393: Cirno的完美算数教室【容斥原理】
    bzoj 3589: 动态树【树链剖分+容斥】
    bzoj 1042: [HAOI2008]硬币购物【容斥原理+dp】
    bzoj 4517: [Sdoi2016]排列计数【容斥原理+组合数学】
    好听的英文歌曲
    颜色色环
    颜色模式
  • 原文地址:https://www.cnblogs.com/rachelross/p/10477478.html
Copyright © 2020-2023  润新知