在Python中利用Pandas按20天间隔拆分时间序列DataFrame
按20天间隔拆分DataFrame(Pandas原生实现)
首先先还原你的原始数据和需求:
原始代码与数据
import pandas as pd mydate = ["01/01/2018","19/01/2018","24/01/2018" , "27/01/2018","29/01/2018","30/01/2018" , "22/02/2018","23/03/2018"] mydate = pd.to_datetime(mydate) events = ["a" , "b" , "c" , "d" , "e" , "f" ,"g" , "h"] df = pd.DataFrame({"date" :mydate,"events" :events}) df
输出的原始DataFrame:
date events 0 2018-01-01 a 1 2018-01-19 b 2 2018-01-24 c 3 2018-01-27 d 4 2018-01-29 e 5 2018-01-30 f 6 2018-02-22 g 7 2018-03-23 h
需求说明
希望按每20天的间隔拆分上述数据,将拆分结果存入独立的DataFrame列表,预期结果:
df_list = [df1 , df2 , df3 , df4] 其中df1包含第0、1行数据,df2包含第2、3、4、5行数据,df3包含第6行数据,df4包含第7行数据
Pandas原生解决方案
咱们可以通过计算日期间隔+分组的方式实现,完全不用手写for循环,步骤如下:
- 计算每个日期与起始日期(DataFrame中最早的日期)的天数差
- 用整数除法将天数差按20天为一组划分分组键
- 按分组键进行
groupby,最后将分组结果转为列表
完整代码:
import pandas as pd # 原始数据生成 mydate = ["01/01/2018","19/01/2018","24/01/2018" , "27/01/2018","29/01/2018","30/01/2018" , "22/02/2018","23/03/2018"] mydate = pd.to_datetime(mydate) events = ["a" , "b" , "c" , "d" , "e" , "f" ,"g" , "h"] df = pd.DataFrame({"date" :mydate,"events" :events}) # 1. 计算每个日期与起始日期的天数差 start_date = df['date'].min() df['days_since_start'] = (df['date'] - start_date).dt.days # 2. 生成20天间隔的分组键 df['group'] = df['days_since_start'] // 20 # 3. 分组并转为DataFrame列表(删除辅助列) df_list = [group_df.drop(['days_since_start', 'group'], axis=1) for _, group_df in df.groupby('group')] # 验证结果 for i, sub_df in enumerate(df_list, 1): print(f"df{i}:") print(sub_df) print("---")
输出结果:
df1: date events 0 2018-01-01 a 1 2018-01-19 b --- df2: date events 2 2018-01-24 c 3 2018-01-27 d 4 2018-01-29 e 5 2018-01-30 f --- df3: date events 6 2018-02-22 g --- df4: date events 7 2018-03-23 h ---
原理说明
- 起始日期选的是DataFrame中最早的
2018-01-01,以此为基准计算每个日期的天数差 // 20是整数除法,比如第24天(2018-01-24)除以20得到1,会被分到第2组;第52天(2018-02-22)除以20得到2,分到第3组,完美匹配你的20天间隔需求- 最后分组时把辅助列(
days_since_start和group)删掉,得到干净的子DataFrame
内容的提问来源于stack exchange,提问作者Viral
相关产品推荐
相关产品推荐

