python:时间序列的处理

Table of Contents

import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder

时间(戳)的格式化

data=pd.read_csv(r"D:\downloads\tempo使用1.csv",encoding='gbk')
data.head()
SYS_NAME CWXT_DB184C COLLECTTIME
0 财务管理系统 34270787.33 2014-10-01
1 财务管理系统 34328899.02 2014-10-02
2 财务管理系统 34327553.50 2014-10-03
3 财务管理系统 34288672.21 2014-10-04
4 财务管理系统 34190978.41 2014-10-05
pd.to_datetime(data['COLLECTTIME'])[0]
Timestamp('2014-10-01 00:00:00')
data['date']=pd.to_datetime(data['COLLECTTIME'],format="%Y-%m-%d")#数据格式化输出
data.head()
SYS_NAME CWXT_DB184C COLLECTTIME date
0 财务管理系统 34270787.33 2014-10-01 2014-10-01
1 财务管理系统 34328899.02 2014-10-02 2014-10-02
2 财务管理系统 34327553.50 2014-10-03 2014-10-03
3 财务管理系统 34288672.21 2014-10-04 2014-10-04
4 财务管理系统 34190978.41 2014-10-05 2014-10-05

提取时间特征:年、月、日、季度等

data['quarter']=data['date'].dt.quarter#提取季度
data.head()
SYS_NAME CWXT_DB184C COLLECTTIME date quarter
0 财务管理系统 34270787.33 2014-10-01 2014-10-01 4
1 财务管理系统 34328899.02 2014-10-02 2014-10-02 4
2 财务管理系统 34327553.50 2014-10-03 2014-10-03 4
3 财务管理系统 34288672.21 2014-10-04 2014-10-04 4
4 财务管理系统 34190978.41 2014-10-05 2014-10-05 4
data['month'],data['day']=data['date'].dt.month,data['date'].dt.day#提取月、天
data.head()
SYS_NAME CWXT_DB184C COLLECTTIME date quarter month day
0 财务管理系统 34270787.33 2014-10-01 2014-10-01 4 10 1
1 财务管理系统 34328899.02 2014-10-02 2014-10-02 4 10 2
2 财务管理系统 34327553.50 2014-10-03 2014-10-03 4 10 3
3 财务管理系统 34288672.21 2014-10-04 2014-10-04 4 10 4
4 财务管理系统 34190978.41 2014-10-05 2014-10-05 4 10 5
data['dayofweek']=data['date'].dt.dayofweek#一周内的第几天
data['weekofyear']=data['date'].dt.week#一年中的第几周
data.head()
SYS_NAME CWXT_DB184C COLLECTTIME date quarter month day dayofweek weekofyear
0 财务管理系统 34270787.33 2014-10-01 2014-10-01 4 10 1 2 40
1 财务管理系统 34328899.02 2014-10-02 2014-10-02 4 10 2 3 40
2 财务管理系统 34327553.50 2014-10-03 2014-10-03 4 10 3 4 40
3 财务管理系统 34288672.21 2014-10-04 2014-10-04 4 10 4 5 40
4 财务管理系统 34190978.41 2014-10-05 2014-10-05 4 10 5 6 40
a=pd.to_datetime('2020-1-1')

判断开始、结束

#判断开始、结束
print(a.is_year_end,
a.is_year_start,
a.is_month_end,
a.is_month_start,
a.is_quarter_start,
a.is_quarter_end)
False True False True True False
data['hour']=data['date'].dt.hour
data.head()
SYS_NAME CWXT_DB184C COLLECTTIME date quarter month day dayofweek weekofyear hour
0 财务管理系统 34270787.33 2014-10-01 2014-10-01 4 10 1 2 40 0
1 财务管理系统 34328899.02 2014-10-02 2014-10-02 4 10 2 3 40 0
2 财务管理系统 34327553.50 2014-10-03 2014-10-03 4 10 3 4 40 0
3 财务管理系统 34288672.21 2014-10-04 2014-10-04 4 10 4 5 40 0
4 财务管理系统 34190978.41 2014-10-05 2014-10-05 4 10 5 6 40 0

判断是否是一天的高峰时段

#是否是一天的高峰时段
data['day_hign']=data['hour'].apply(lambda x:0 if 0<=x<8 else 1)
data.head()
SYS_NAME CWXT_DB184C COLLECTTIME date quarter month day dayofweek weekofyear hour day_hign
0 财务管理系统 34270787.33 2014-10-01 2014-10-01 4 10 1 2 40 0 0
1 财务管理系统 34328899.02 2014-10-02 2014-10-02 4 10 2 3 40 0 0
2 财务管理系统 34327553.50 2014-10-03 2014-10-03 4 10 3 4 40 0 0
3 财务管理系统 34288672.21 2014-10-04 2014-10-04 4 10 4 5 40 0 0
4 财务管理系统 34190978.41 2014-10-05 2014-10-05 4 10 5 6 40 0 0

构造时间特征

#构造过去n天的统计数据
def get_statis_n_days_num(data,col,n):
    temp=pd.DataFrame()
    for i in range(n):
        temp=pd.concat([temp,data[col].shift((i+1)*24)],axis=1)
        data['avg_'+str(n)+"_days_"+col]=temp.mean(axis=1)
        data['median_'+str(n)+"days"+col]=temp.median(axis=1)
        data['max_'+str(n)+"_days_"+col]=temp.max(axis=1)
        data['min_'+str(n)+"_days_"+col]=temp.min(axis=1)
        data['std'+str(n)+"_days_"+col]=temp.std(axis=1)
    return data
get_statis_n_days_num(data,'CWXT_DB184C',n=7).tail()
d:\software\python\lib\site-packages\numpy\lib\nanfunctions.py:1114: RuntimeWarning: All-NaN slice encountered
  overwrite_input=overwrite_input)
SYS_NAME CWXT_DB184C COLLECTTIME date quarter month day dayofweek weekofyear hour day_hign avg_7_days_CWXT_DB184C median_7daysCWXT_DB184C max_7_days_CWXT_DB184C min_7_days_CWXT_DB184C std7_days_CWXT_DB184C
36 财务管理系统 35606941.11 2014-11-06 2014-11-06 4 11 6 3 45 0 0 34328674.80 34328674.80 34328674.80 34328674.80 NaN
37 财务管理系统 35546714.13 2014-11-07 2014-11-07 4 11 7 4 45 0 0 34234933.61 34234933.61 34234933.61 34234933.61 NaN
38 财务管理系统 35510966.73 2014-11-08 2014-11-08 4 11 8 5 45 0 0 34022726.41 34022726.41 34022726.41 34022726.41 NaN
39 财务管理系统 35491498.51 2014-11-09 2014-11-09 4 11 9 6 45 0 0 35016309.47 35016309.47 35016309.47 35016309.47 NaN
40 财务管理系统 35601990.55 2014-11-10 2014-11-10 4 11 10 0 46 0 0 34981412.82 34981412.82 34981412.82 34981412.82 NaN

时间差及其转换

a=pd.to_datetime('2020-07-21 12:12:01')
b=pd.to_datetime('2020-07-20 12:12:23')
c=pd.to_datetime('2020-07-21 00:12:01')
d=pd.to_datetime('2020-07-21 01:00:01')
a-b#计算时间差
Timedelta('0 days 23:59:38')
(a-c)
Timedelta('0 days 12:00:00')
#将时间差,转换成秒
(a-c).seconds
43200
(d-c).seconds
2880
# 跨天转化秒时容易出错
(a-b).seconds
86378
def calTimesDiff(t1, t2):
    """
    计算时间戳之间的差值,单位h(同一天)
    :param t1:
    :param t2:
    :return:
    """
    # 1.先转成秒
    # 2.再将秒转换成小时
    t1_seconds = str(t1).split()[-1].split(":")
    t1_seconds = sum([int(i) * 60 ** (2 - num) for num, i in enumerate(t1_seconds)])

    t2_seconds = str(t2).split()[-1].split(":")
    t2_seconds = sum([int(i) * 60 ** (2 - num) for num, i in enumerate(t2_seconds)])
    return abs(round((t2_seconds - t1_seconds) / 3600, 3))
calTimesDiff(d,c)
0.8
a-b#计算时间差
Timedelta('0 days 23:59:38')
#将a-b转换成小时
def convertTimestampToSec(a_b):
    """
    将时间差转换成秒
    """
    a_b_str=str(a_b).split()
    day=int(a_b_str[0])
    sec=sum([int(i)*60**(2-num) for num,i in enumerate(a_b_str[-1].split(":"))])
    res=day*24*3600+sec
    return res
convertTimestampToSec(a-b)#23*3600+59*60+38
86378

时间的前进与后退

pd.Timedelta
help(pd.Timedelta)

class Timedelta(_Timedelta)
 |  Represents a duration, the difference between two dates or times.
 |  
 |  Timedelta is the pandas equivalent of python's ``datetime.timedelta``
 |  and is interchangeable with it in most cases.
 |  
 |  Parameters
 |  ----------
 |  value : Timedelta, timedelta, np.timedelta64, string, or integer
 |  unit : str, default 'ns'
 |      Denote the unit of the input, if input is an integer.
 |  
 |      Possible values:
 |  
 |      * 'Y', 'M', 'W', 'D', 'T', 'S', 'L', 'U', or 'N'
 |      * 'days' or 'day'
 |      * 'hours', 'hour', 'hr', or 'h'
 |      * 'minutes', 'minute', 'min', or 'm'
 |      * 'seconds', 'second', or 'sec'
 |      * 'milliseconds', 'millisecond', 'millis', or 'milli'
 |      * 'microseconds', 'microsecond', 'micros', or 'micro'
 |      * 'nanoseconds', 'nanosecond', 'nanos', 'nano', or 'ns'.
a+pd.Timedelta(2,unit='days')
Timestamp('2020-07-23 12:12:01')
a+pd.Timedelta(2,unit='m')
Timestamp('2020-07-21 12:14:01')
pd.DateOffset

help(pd.DateOffset)`也具有的类似的功能:但是需要注意关键词单复数的区别:

Parameters that **add** to the offset (like Timedelta):
 |  
 |      - years
 |      - months
 |      - weeks
 |      - days
 |      - hours
 |      - minutes
 |      - seconds
 |      - microseconds
 |      - nanoseconds
 |  
Parameters that **replace** the offset value:
 |  
 |      - year
 |      - month
 |      - day
 |      - weekday
 |      - hour
 |      - minute
 |      - second
 |      - microsecond
 |      - nanosecond.
    
a+pd.DateOffset(days=1)
Timestamp('2020-07-22 12:12:01')
b+pd.DateOffset(day=1)
Timestamp('2020-07-01 12:12:23')
posted @ 2020-08-30 13:02  LgRun  阅读(319)  评论(0编辑  收藏  举报