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