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')