You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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循环,步骤如下:

  1. 计算每个日期与起始日期(DataFrame中最早的日期)的天数差
  2. 用整数除法将天数差按20天为一组划分分组键
  3. 按分组键进行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:56:41