Skip to main content
 首页 » 编程设计

python之Pandas :按特定日期分组

2025年05月04日19shangdawei

我想按特定日期拆分数据框,截止级别为 3 月 31 日。这意味着 3 月 31 日之前的所有内容都应该属于一个数据框,之后的所有内容都应该属于下一个数据框,依此类推。数据如下所示:

                    c_name       date  revenue  t_rev 
310260  1-800 CONTACTS INC 1997-01-31    3.628      0 
296014  1-800 CONTACTS INC 1998-01-31    6.970      0 
291248  1-800 CONTACTS INC 1998-05-06   10.429      0 
287356  1-800 CONTACTS INC 1998-08-11   12.801      0 
283720  1-800 CONTACTS INC 1998-11-10   18.419      0 
279837  1-800 CONTACTS INC 1999-02-24   18.227      0 
277333  1-800 CONTACTS INC 1999-04-27   22.304      0 
274650  1-800 CONTACTS INC 1999-07-20   23.960      0 
269885  1-800 CONTACTS INC 1999-10-26   26.890      0 
265851  1-800 CONTACTS INC 2000-02-07   25.371      0 

预期输出:

df1: 
                        c_name       date  revenue  t_rev 
    310260  1-800 CONTACTS INC 1997-01-31    3.628      0 
 
df2: 
                        c_name       date  revenue  t_rev 
    296014  1-800 CONTACTS INC 1998-01-31    6.970      0 
 
df3: 
                        c_name       date  revenue  t_rev 
    291248  1-800 CONTACTS INC 1998-05-06   10.429      0 
    287356  1-800 CONTACTS INC 1998-08-11   12.801      0 
    283720  1-800 CONTACTS INC 1998-11-10   18.419      0 
    279837  1-800 CONTACTS INC 1999-02-24   18.227      0 
 
df4:  
 
                         c_name       date  revenue  t_rev 
    277333  1-800 CONTACTS INC 1999-04-27   22.304      0 
    274650  1-800 CONTACTS INC 1999-07-20   23.960      0 
    269885  1-800 CONTACTS INC 1999-10-26   26.890      0 
    265851  1-800 CONTACTS INC 2000-02-07   25.371      0 

到目前为止我的代码如下:

import pandas as pd 
 
 
path = 'C:/Users/Adrian/Desktop/' 
df = pd.read_csv(path + "trailing.csv", low_memory=False, usecols=[0, 3, 6]) 
df.rename(columns={'report_dte': 'date'}, inplace=True) 
df['date'] = pd.to_datetime(df['date'], format="%d/%m/%Y") 
df = df.sort_values(["date"], ascending=True) 
df['t_rev'] = 0 
 
df2 = df.groupby("c_name") 
counter = 0 
for c_name, df_name in df2: 
    counter += 1 
 
    print(df_name.sort_values(['date'], ascending=True)) 
    print(len(df_name.index)) 
    if counter == 1: 
        break 

@Josh Friedlander、@Jeril 和@KeepAlive 解决方案按预期工作。谢谢大家!

请您参考如下方法:

我尝试运行这段代码,但我想它应该可以工作。

def getFiscalYear(dt): 
    year = dt.year 
    if dt.month<4: year -= 1 
    return year 
 
df['year'] = df['date'].apply(getFiscalYear) 
df.groupby('year') 

确保“日期”列的类型为 pd.datetime。我们在这里所做的是,我们正在尝试创建一个基于财政年度的列,并以此为基础进行分组。

如果您想为每年创建一个数据框,那么您可以遍历“年”列并在创建新数据框的过程中创建新的数据框。

df_dict = {} 
for year in df['year'].unique(): 
    df_dict[year] = df[df['year' == year]]