天天看点

实战Pandas 按时间区间分组处理数据

作者:大肚皮程序猿
实战Pandas 按时间区间分组处理数据

客户EXCEL表,里面都包含时间及其它数据,见下图:

实战Pandas 按时间区间分组处理数据

要求以24秒为一组对后面数据进行求平均,分组信息见下图:

实战Pandas 按时间区间分组处理数据

分析:时间没有规则,不能恰好按24秒进行分组,只能小于等于24秒,可以使用 Pandas 的 pd.to_timedelta 函数将时间字符串转换为 timedelta 类型,然后使用 pd.cut 函数对时间进行分组。

#数据读取
df =pd.read_excel("20171124.xlsx")
#查看类型
df.dtypes           
实战Pandas 按时间区间分组处理数据
# 将时间字符串转换为 timedelta 类型
df['Time'] = df['主要信息时间'].apply(lambda x: datetime.strptime(str(x), '%H:%M:%S').time())
df['Time'] = df['Time'].apply(lambda x: timedelta(hours=x.hour, minutes=x.minute, seconds=x.second))           
实战Pandas 按时间区间分组处理数据
# 对时间进行分组,每 24 秒一个分组
time_bins = pd.timedelta_range(start='0 days', end='23:59:57',freq='24S')
df['Time_Group'] = pd.cut(df['Time'], bins=time_bins)           
实战Pandas 按时间区间分组处理数据
# 对分组后的数据进行聚合,计算每个时间段内的值之和
result = df.groupby('Time_Group').mean().reset_index()           
实战Pandas 按时间区间分组处理数据

全部代码:

import pandas as pd
from datetime import datetime, time, timedelta
import os

#获取文件了列表
f_lst=os.listdir(os.getcwd()+"/data")
f_lst

#遍历文件
for i in f_lst:
    #数据读取
    df =pd.read_excel(os.getcwd()+"/data/"+i)
    # 将时间字符串转换为 timedelta 类型
    df['Time'] = df['主要信息时间'].apply(lambda x: datetime.strptime(str(x), '%H:%M:%S').time())
    df['Time'] = df['Time'].apply(lambda x: timedelta(hours=x.hour, minutes=x.minute, seconds=x.second))
    # 对时间进行分组,每 24 秒一个分组
    time_bins = pd.timedelta_range(start='0 days', end='23:59:57',freq='24S')
    df['Time_Group'] = pd.cut(df['Time'], bins=time_bins)
    # 对分组后的数据进行聚合,计算每个时间段内的值之和
    result = df.groupby('Time_Group').mean().reset_index()
    result.to_excel(os.getcwd()+"/output/"+i)
               

遍历原文件逐个处理后保存到新文件夹,中间试了很多办法,感觉这个方法效率最高,欢迎大家批评指正优化,谢谢!