zoukankan      html  css  js  c++  java
  • pandas的时间序列:日期操作、时间序列平滑

     
    基础操作

    1)将“字符类型的日期列”转化成“时间索引(DatetimeIndex)”

    u  首先,利用 pandas 的to_datetime 方法,把 "date" 列的字符类型数据解析成 datetime 对象。然后,把 "date" 列用作索引。

    df['date'] = pd.to_datetime(df['date'])

    df.set_index("date", inplace=True)

    u  一步转化

    df2.index = pd.DatetimeIndex(df.index)

    temp = pd.DatetimeIndex(data['datetime'])

    #获取日期

    data['date'] = temp.date

    #获取时间点

    data['time'] = temp.time

    #将日期转化为一周中的星期几

    pd.DatetimeIndex(data.date).dayofweek

    # 对时间类特征处理,产出一个时间长度变量

    data['dateDays'] = (data.date - data.date[0]).astype('timedelta64[D]')

    2)将日期列索引转化每月当中的第几天,或者转化为一周里面的星期几。

    再次使用bikes数据集

    bikes = pd.read_csv('../data/bikes.csv', sep=';', encoding='latin1', parse_dates=['Date'], dayfirst=True, index_col='Date')

    berri_bikes.index.day

    berri_bikes.index.weekday

    3)不规整的日期字符串会自动转化为标准类型来进行索引

    bikes['1/10/2011']

    bikes['20110110']

    4)根据日期索引获取数据

    longer_ts = Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))

    #获取2001年的所有行

    longer_ts['2001']

    #获取2001年5月的所有行

    longer_ts['2001-05']  同longer_ts.ix['5-2001']

    #获取2011.01.07后的所有数据

    longer_ts [datetime(2011, 1, 7):]  切片操作

    dates = pd.DatetimeIndex(['1/1/2000', '1/2/2000', '1/2/2000', '1/2/2000', '1/3/2000'])

    dup_ts = Series(np.arange(5), index=dates)

    #判断日期索引中每个日期是否是单一的

    dup_ts.index.is_unique

    #如果索引的日期是单一的,返回该行的索引值

    dup_ts['1/3/2000']

    #如果索引的日期不是单一的,返回所有相同索引的行

    dup_ts['1/2/2000']

    日期的范围、频率与移动

    下表是时间频率单位:

     

     

    #生成某个范围的日期序列

    pd.date_range('4/1/2012', '6/1/2012')

    pd.date_range(start='4/1/2012', periods=20)

    pd.date_range(end='6/1/2012', periods=20)

    pd.date_range('5/2/2012 12:56:31', periods=5)

    pd.date_range('5/2/2012 12:56:31', periods=5, normalize=True)  #返回的日期格式5/2/2012

    #以一定频率产生时间序列

    pd.date_range('1/1/2000', '12/1/2000', freq='BM')  #返回给定日期范围内每个月的最后一个工作日

    pd.date_range('1/1/2000', '1/3/2000 23:59', freq='4h')

    pd.date_range('1/1/2000', periods=10, freq='1h30min')

    pd.date_range('1/1/2012', '9/1/2012', freq='WOM-3FRI')

    # shift()将时间序列整体向前或向后移动固定长度的时间

    ts = Series(np.random.randn(4), index=pd.date_range('1/1/2000', periods=4, freq='M'))

    ts.shift(2)

    >>> 

    2000-01-31         NaN

    2000-02-29         NaN

    2000-03-31      1.529481

    2000-04-30      0.267158

    ts.shift(-2)  #向后移动

    #假设数据是股票价格数据,shift()常用来计算股票收益率

    ts / ts.shift(1) – 1 

    #按照某一个频率移动

    ts.shift(2, freq='M')

    ts.shift(3, freq='D')

    ts.shift(1, freq='3D')

    ts.shift(1, freq='90T')

    #时间序列滚动的第二种方式

    from pandas.tseries.offsets import Day, MonthEnd

    now = datetime(2011, 11, 17)

    now + 3 * Day()  #滚动到3天后的日期

    now + MonthEnd()  #滚动到当月末

    now + MonthEnd(2)  #滚动到下个月末

    #时间滚动的第三种方式

    offset = MonthEnd()

    offset.rollforward(now)  #从当前日期向前滚动到当月末

    offset.rollback(now)   #从当前日期向后滚动到上月末

    #计算平均值很重要的一种方式

    from pandas.tseries.offsets import Day, MonthEnd

    offset = MonthEnd()

    ts = Series(np.random.randn(20), index=pd.date_range('1/15/2000', periods=20, freq='4d'))

    ts.groupby(offset.rollforward).mean()  #按月滚动,即计算每个月的平均值

    时间序列的平滑化

     

    #移动平均:每个时间点的值均由该时间点前窗口值大小的所有数的平均

    pd.rolling_mean(close_px.AAPL, 250).plot()

    pd.rolling_std(close_px.AAPL, 250, min_periods=10)

    #指数加权移动平均

    pd.ewma(aapl_px, span=60)

  • 相关阅读:
    sql 数据库 初级 个人学习总结(一)
    parentViewController
    关于iOS9之后的loadViewIfNeeded
    判断版本号
    MagicalRecord(简化CoreData操作)
    coreData
    PureLayout(轻量级自动布局)
    MJRefresh(上拉加载下拉刷新)
    MJExtension(JSON到数据模型的自动转换)
    BaceModel
  • 原文地址:https://www.cnblogs.com/yongfuxue/p/10107245.html
Copyright © 2011-2022 走看看