Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:按具体日期分组_Python_Python 3.x_Pandas - Fatal编程技术网

Python 熊猫:按具体日期分组

Python 熊猫:按具体日期分组,python,python-3.x,pandas,Python,Python 3.x,Pandas,我想按特定日期分割数据帧,截止日期为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 29124

我想按特定日期分割数据帧,截止日期为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')

我不想试着运行这个代码,但我想它应该可以工作

def getFiscalYear(dt):
    year = dt.year
    if dt.month<4: year -= 1
    return year

df['year'] = df['date'].apply(getFiscalYear)
df.groupby('year')
做什么

import datetime as dt

years        = range(1997, 2000 + 1)
df['date64'] = df.date.astype("datetime64")

for y,year in enumerate(years):
    min_date = dt.datetime(year    , 3, 31)
    max_date = dt.datetime(year + 1, 3, 31)

    globals()[f'df{y+1}'] = df.loc[
        (min_date < df.date64) & (df.date64 <= max_date)
    ].copy()
或者用同样的方法做同样的事情

做什么

import datetime as dt

years        = range(1997, 2000 + 1)
df['date64'] = df.date.astype("datetime64")

for y,year in enumerate(years):
    min_date = dt.datetime(year    , 3, 31)
    max_date = dt.datetime(year + 1, 3, 31)

    globals()[f'df{y+1}'] = df.loc[
        (min_date < df.date64) & (df.date64 <= max_date)
    ].copy()
或者用同样的方法做同样的事情


一个更好的方法是使用内置期间:


一个更好的方法是使用内置期间:



使用loc和分配新dfs比使用groupby@JoshFriedlander对不起打扰你了,你能再解释一下吗?我是否应该使用loc将数据帧划分为每个公司的数据帧?或者你的确切意思是什么?见Jeril的答案,但第二部分-这就是我建议使用loc和分配新dfs比使用groupby@JoshFriedlander对不起打扰你了,你能再解释一下吗?我是否应该使用loc将数据帧划分为每个公司的数据帧?或者你的确切意思是什么?见Jeril的回答,但第二部分-这就是我建议的,把关于这是否是一个好的实践的讨论放在一边。-我认为这真的是错误的做法,更好的做法是dict@Adrian它有用吗?我现在无法测试我的代码。@Adrian。这是因为当您在dfs中为元素执行以下操作时:printeach element,element,您并不是在打印元素本身,而是在字典中打印它们的关联键。在dfs中为key,element执行。项目:打印每个元素,key,element如果我的建议按预期工作,可能只是编辑您的问题以反映这一点?:。。。Thx:@keepAlive是的,只是这样做了:把关于这是否是一个好的实践的讨论放在一边。-我认为这真的是错误的做法,更好的做法是dict@Adrian它有用吗?我现在无法测试我的代码。@Adrian。这是因为当您在dfs中为元素执行以下操作时:printeach element,element,您并不是在打印元素本身,而是在字典中打印它们的关联键。在dfs中为key,element执行。项目:打印每个元素,key,element如果我的建议按预期工作,可能只是编辑您的问题以反映这一点?:。。。Thx:@keepAlive是的,刚刚这么做了:用df.loc[df['year'==year]代替df.loc[df['year'==year],而不是df[df['year'==year]]使用df.loc[df['year'==year]你的代码按预期工作,但是顶部出现了一个小错误:a:/python项目/trailing_accounts/read_excel.py:32:SettingWithCopyWarning:试图在数据帧中的切片副本上设置值。尝试改用.loc[row\u indexer,col\u indexer]=value。您知道这可能是什么原因吗?read\u excel是.py文件的名称。最初,我使用的是excel,而不是CSV。现在将其更改为_csv,以匹配当前的问题。第32行是这样的:df_name['year']=df_name.date.dt.to_period'A-MAR'我将df更改为df_name,因为我首先需要按名称对数据进行分组,然后按年份进行分组。是否已排序?是的,问题已解决。非常感谢您的时间。不客气:我认为我的回答会比Jeril建议的使用apply更快/更地道,但如果性能不是主要问题,那么无论什么工作……您的代码都能按预期工作,但是顶部出现了一个小错误:a:/python项目/trailing_accounts/read_excel.py:32:SettingWithCopyWarning:试图在数据帧中的切片副本上设置值。尝试改用.loc[row\u indexer,col\u indexer]=value。您知道这可能是什么原因吗?read\u excel是.py文件的名称。最初,我使用的是excel,而不是CSV。现在将其更改为_csv,以匹配当前的问题。第32行是这样的:df_name['year']=df_name.date.dt.to_period'A-MAR'我将df更改为df_name,因为我首先需要按名称对数据进行分组,然后按年份进行分组。是否已排序?是的,问题已解决。非常感谢您的时间。不客气:我认为我的答案比使用Jeril建议的apply更快/更地道,但如果性能不是主要问题,那么无论什么都可以。。。
dfs = []
#...
    #...
    dfs.append(
        df.loc[(min_date < df.date64) & (df.date64 <= max_date)].copy()
    )
df['year'] = df.date.dt.to_period('A-MAR')  # assigns years ending in March
dfs = [df.loc[df.year == year] for year in df.year.unique()]  
# gives list of dfs divided by year