Pandas应用小记(一)

2016-04-11
综合使用:Pandas.DataFrame读取、合并、修改列数据、新增列、分组、分组数据计算

日志文件数据示例:

查询日期 预约日期 城市 区域 机器总数 使用数 空闲数
2016-04-07 03:59 2016-04-14 10:00 北京 分钟寺 8 4 4
2016-04-07 03:59 2016-04-14 11:00 北京 分钟寺 8 6 2
2016-04-07 04:00 2016-04-07 13:00 北京 黄村 6 4 2
2016-04-07 04:00 2016-04-07 14:00 北京 黄村 6 4 2

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

    frame_columns = ['query_time','service_time','city_name',\
    'biz_name','total_num','free_num','busy_num']
    #创建空DataFrame
    all_frame = DataFrame()

    #读取日志文件,并合并为一个DataFrame
    for file_name in file_list:
        path = "c:\\log\\houseBizStock."+file_name+".log"
        if os.path.exists(path):
        #加载日志文件,读取数据
           df = pd.read_table(path,sep='\t',names=frame_columns)
           all_frame = all_frame.append(df,ignore_index=True)

##根据时间段区分上午还是下午,并将该列加入到DataFrame中去
    #获取2016-04-14 16:00中的16
    am = ((all_frame.service_time.str)[11:13]).apply(lambda x : int(x))

    #筛选条件,小于12点为上午
    am = am <= 12
    #根据条件进行分类,符合am标识为'am',否则为'pm'
    am = np.where(am,'am','pm') 
    #从numpy.ndarray转换为Series
    am = Series(am,name='half_day')

    #加入1列到原有DataFrame
    all_frame = pd.concat([all_frame,am],axis = 1)

##将2016-04-07 03:59数据调整为整点数
    #找到含有'2016-04-07 03:59'中含有59的数据
    fifty_nine = all_frame.query_time.str.contains('59')

     #转换为日期格式
    #last_minute = all_frame.query_time.apply(lambda x : parse(x))  #可行方法一

    last_minute = all_frame.query_time.apply(lambda x : datetime.strptime(x,'%Y-%m-%d %H:%M')) #可行方法二

    #加上1分钟
    one_minute = timedelta(minutes = 1)
    last_minute[fifty_nine] = last_minute[fifty_nine] + one_minute

    #转换为字符串格式
    all_frame.query_time = last_minute.apply(lambda x:str(x))

##根据am、pm 对数据进行分组计算
    days = one_day.groupby(['query_time','service_time',\
    'city_name','biz_name','half_day'])
    for item,group in days:
        query_time,service_time,city_name,biz_name,\
        half_day = item
        #中文字符转换
        city_name = unicode(city_name,'utf-8')
        biz_name = unicode(biz_name,'utf-8')

        #计算机器利用率
        busy_num = group.busy_num.sum()
        total_num = group.total_num.sum()
        rate = float(busy_num) / total_num
        rate = round(rate,2)

        print query_time,service_time,city_name,biz_name,\
        half_day,busy_num,total_num,rate
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值