python数据预处理实战2.0


前言

最近在之前的数据基本预处理工作之上,增加了两个新的工作。

1.数据扩容,将数据的维度由3列扩容到13列

2.对于数据扩容后的数据,进行两方面的条件筛选:
a.通过pid、起止时间查询 getInfoBypidtime(方法名)
b.通过pid、星期、规定时段查询 getInfoBypid_wk_trange(方法名)


数据扩容

之前规整后的数据有三列
数据格式如下:

2017-08-28 23:37:00,14,84742aa602e4

现在想对数据进行扩容处理,增加列数,以便于后续更加复杂的数据处理

设定各个列的属性为:

[原数据,时间戳,年,月,日,时,分,秒,星期,分秒,pid,mac,是否为节假日]

拟得到的数据形式为:

2017-08-28 23:37:00,1503934620,2017,8,28,23,37,0,0,2337,14,84742aa602e4,N

数据扩容 python 代码如下:

# -*- coding: UTF-8 -*-

import csv
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
from dateutil.parser import parse
import datetime
import time

__author__ = 'SuZibo'

"""
增加打散数据的维度
原数据,时间戳,年,月,日,时,分,秒,星期,分秒,pid,mac,是否为节假日
"""


holiday =['2017-09-02','2017-09-03','2017-09-09','2017-09-10','2017-09-16','2017-09-17','2017-09-23','2017-09-24','2017-10-01','2017-10-02','2017-10-03','2017-10-04','2017-10-05','2017-10-06','2017-10-07','2017-10-08','2017-10-14','2017-10-15','2017-10-21','2017-10-22','2017-10-28','2017-10-29','2017-11-04','2017-11-05','2017-11-11','2017-11-12']
#节假日数组,字符串类型

rs = open('./macdata/normalinfo_add.txt', 'w')
#输出文件为:normalinfo_add.txt

with open('./macdata/normal_origin_info.txt') as file:
#打开文件

    for line in file:

        new_line = []
        #将每行对应的原始数据扩容后的数据,每项写入新列表
        line = line.split(',')
        new_line.append(line[0])
        #保留源数据(第一列)

        timeArray = time.strptime(line[0], "%Y-%m-%d %H:%M:%S")
        #生成时间数组

        hr_min = str(timeArray.tm_hour) + str(timeArray.tm_min)

        new_line.append(int(time.mktime(timeArray)))
        #添加时间戳
        new_line.append(timeArray.tm_year)
        #年份
        new_line.append(timeArray.tm_mon)
        #月份
        new_line.append(timeArray.tm_mday)
        #日期
        new_line.append(timeArray.tm_hour)
        #小时
        new_line.append(timeArray.tm_min)
        #分钟
        new_line.append(timeArray.tm_sec)
        #seconds
        new_line.append(timeArray.tm_wday)
        #星期几 0-6 0是周一
        new_line.append(hr_min)
        #小时+分钟  format:2337

        new_line.append(line[1])
        #地点id
        new_line.append(line[2])
        #mac info

        if  line[0][:10] in holiday:
            new_line.append('Y')
        else:
            new_line.append('N')
        #是否是节假日

        rs.write(str(new_line[0])+','+str(new_line[1])+','+str(new_line[2])+','+str(new_line[3])+','+str(new_line[4])+','+str(new_line[5])+','+str(new_line[6])+','+str(new_line[7])+','+str(new_line[8])+','+str(new_line[9])+','+str(new_line[10])+','+str(new_line[11].strip('\n'))+','+str(new_line[12])+'\n')
#第12位mac地址后面自带换行符,要去掉
#最后+'\n'是为了文件换行

rs.close()

# 2017-08-28 23:37:00,14,84742aa602e4
# 2017-08-28 23:37:00,ts,2017,08,28,23,37,00,1,2337,14,84742aa602e4

数据筛选

好了,数据扩容(数据进一步规整化了)之后,要对得到的数据进行进一步的筛选
这里得自己写筛选条件
方法1:getInfoBypidtime(pid,start_time,end_time)
参数说明:

pid:地点id
start_time:查询开始时间,格式为:'2017-08-28'
end_time:查询结束时间,格式为:'2017-08-28'

方法2:getInfoBypid_wk_trange(idplaces,weekday,timeranges)
参数说明:

pid:地点集合,格式为:[151,152,153]
weekday:星期几的集合,格式为:[2,3,4]
timeranges:[[830,1200],[1400,1830],......]


python代码如下:

# -*- coding: UTF-8 -*-

import numpy as np
import pandas as pd
from pandas import Series, DataFrame
from dateutil.parser import parse
import datetime

__author__ = 'SuZibo'

"""
查询数据
1.通过pid、起止时间查询
2.通过pid、星期、规定时段查询
"""

# records = pd.read_csv('./macdata/normal_origin_info.txt',names=['time','idplace','mac'])
pid = 153
#place id
start_time = '2017-08-28 00:00:00'
end_time = '2017-09-28 00:00:00'
#自定  需要符合上述格式




start_date = '2017-08-28'
end_date = '2017-11-16'
weekdaylist =[]

sdate = datetime.datetime.strptime(start_date,'%Y-%m-%d')
edate = datetime.datetime.strptime(end_date,'%Y-%m-%d')
#字符串转时间
while sdate<edate:
    weekdaylist.append(sdate.strftime('%Y-%m-%d'))
    sdate += datetime.timedelta(days=1)
#得到起止日期中的所有日期
wlist=[]
#目标工作日
for i in xrange(len(weekdaylist)):
    if  datetime.datetime.strptime(weekdaylist[i],'%Y-%m-%d').weekday() == weekday-1:
        wlist.append(weekdaylist[i])
        i = i+7
#将符合weekday参数的工作日筛选出来
#其实上面weekday的代码没什么用,但,代表了笔者的一段心路历程w



def getInfoBypidtime(idplace,sdatetime,edatetime):

    records = pd.read_csv('./macdata/normalinfo_add.txt', names=['time','ts','year','month','day','hour','min','sec','weekday','min_hr','pid','mac','isholiday'],usecols=[0,10,11])
    #usecols选取指定列(这里选了三列,源数据时间列,pid列,mac列),若选取全部列则会出现memoryerror(说多了都是泪)

    s = sdatetime[5:7]+sdatetime[8:10]
    e = edatetime[5:7]+edatetime[8:10]
    #输出文件名规范
    idplace_time_info = records[ (records['pid'] == idplace) & (records['time'] > sdatetime) & (records['time'] < edatetime) ]
    #筛选符合条件的数据
    outputpath = './macdata/selectinfo/' + 'pid_' + str(idplace) + '_' + s + '-' + e + '.csv'
    idplace_time_info.to_csv(outputpath, header=False, index=False)


"""
规整前的数据:
2017-08-28 23:37:00,14,84742aa602e4
规整后的数据:
2017-08-28 23:37:00,ts,2017,08,28,23,37,00,1,2337,14,84742aa602e4,N
带入的参数:
[1,2], [4,5],[[830,900],[1400,1600]]
"""
#以上是方法二的输入参数规范

idplaces = [151,152,153]
weekday = [2,3,4]
#0是周一
timeranges = [[830,1200],[1400,1830]]

def getInfoBypid_wk_trange(idplaces,weekdays,timeranges):
    p = ''
    w = ''

    for i in xrange(len(idplaces)):
        p += str(idplaces[i]) + '_'

    for i in xrange(len(weekday)):
        w += '_' + str(weekday[i])
    #方法二输出文件名规范

    outputpath2 = './macdata/selectinfo/' + 'pids_' + p + 'wkdays' + w + '.csv'

    rs = open(outputpath2, 'w')
    with open('./macdata/normalinfo_add.txt') as file:

       # new_line =[]

        for line in file:
            line = line.split(',')
            for i in xrange(len(timeranges)):
                if int(line[9])>timeranges[i][0] and int(line[9])<timeranges[i][1]:
                    if int(line[8]) in weekdays and int(line[10]) in idplaces:
                    #两层筛选,第一层筛时间数组,第二层筛pid
                        line[-2] = line[-2].strip('\n')
                        line[-1] = line[-1].strip('\n')
                        line2 = str(line)
                        line2 = line2.strip('[').strip(']').replace("'", "").replace(" ","")
                        #去空格,去单引号
                        line2 = line2[:10]+' '+line2[10:]
                        #时间重新拼接

                        rs.write(str(line2)+'\n')
    rs.close()

getInfoBypid_wk_trange(idplaces,weekday,timeranges)
# getInfoBypidtime(pid,start_time,end_time)

到这里位置,毕业设计的数据预处理工作已经完成了
撒花!★,°:.☆( ̄▽ ̄)/$:.°★

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容