基于Agent与时间范围匹配计算时间序列的均值及数据量
解决方法
首先需要确保所有日期列都是datetime类型,否则无法正确进行时间范围比较:
import pandas as pd # 转换df1的日期列 df1['start_date'] = pd.to_datetime(df1['start_date']) df1['end_date'] = pd.to_datetime(df1['end_date']) # 转换df2的日期列 df2['datetime_log'] = pd.to_datetime(df2['datetime_log'])
方法一:合并+筛选+分组聚合(高效适合大数据量)
- 按
Agent合并两个DataFrame,让df2的每条数据匹配到df1中对应Agent的时间范围 - 筛选出落在对应时间范围内的数据
- 按
Agent分组计算均值和数据条数 - 将结果合并回df1,补全无数据Agent的计数为0
# 合并两个DataFrame merged = pd.merge(df2, df1, on='Agent', how='right') # 筛选符合时间范围的记录 filtered = merged[(merged['datetime_log'] >= merged['start_date']) & (merged['datetime_log'] <= merged['end_date'])] # 分组计算统计值 agg_stats = filtered.groupby('Agent').agg( mean_df2=('value', 'mean'), count_df2=('value', 'count') ).reset_index() # 合并回df1,填充缺失值 result = pd.merge(df1, agg_stats, on='Agent', how='left') result['count_df2'] = result['count_df2'].fillna(0).astype(int)
方法二:逐行应用函数(直观易理解)
直接遍历df1的每一行,针对每个Agent和时间范围筛选df2的数据,计算统计值后合并回原表:
def get_agent_stats(row): # 筛选当前Agent且在时间范围内的数据 agent_records = df2[(df2['Agent'] == row['Agent']) & (df2['datetime_log'] >= row['start_date']) & (df2['datetime_log'] <= row['end_date'])] # 返回均值和计数 return pd.Series({ 'mean_df2': agent_records['value'].mean(), 'count_df2': len(agent_records) }) # 应用函数到df1的每一行,合并结果 result = df1.join(df1.apply(get_agent_stats, axis=1))
两种方法最终都会得到目标结果:无匹配数据的Agent(如Sam)会显示mean_df2为NaN,count_df2为0。
内容的提问来源于stack exchange,提问作者ArniSuter
相关产品推荐
相关产品推荐

