【问题标题】:Pandas -- how to iterate through a list of dates which filter a DataFramePandas——如何遍历过滤 DataFrame 的日期列表
【发布时间】:2014-05-11 14:16:05
【问题描述】:

Pandas -- 如何遍历过滤 DataFrame 的日期列表

我有一个 DataFrame 'numbers',像这样:

         Date   group    Number
0  2013-02-01  group1 -0.098765
1  2013-02-02  group2  0.519878
2  2013-02-03  group1 -0.098765
3  2013-02-04  group3  1.960784
4  2013-02-05  group3  2.859412
5  2013-02-06  group2  1.960784
6  2013-02-07  group1 -0.696594

还有另一个 DataFrame 中的日期列表,“datelist”,如下所示:

          Date
0    2013, 3,5
1    2013, 3,6
2    2013, 3,7
3    2013, 3,8
4    2013, 3,9
5   2013, 3,10
6   2013, 3,11

我正在尝试返回一个新的数据框,其中包含“数字”中的每条记录,其中日期为

我试过这个:

for date in datelist:
    end = datelist['Date'] 
    numbers2 = numbers[numbers.Date <= end] 

但 for 循环返回一个与原始 DataFrame 'numbers' 相同的 DataFrame。

         Date   group    Number
0  2013-02-01  group1 -0.098765
1  2013-02-02  group2  0.519878
2  2013-02-03  group1 -0.098765
3  2013-02-04  group3  1.960784
4  2013-02-05  group3  2.859412
5  2013-02-06  group2  1.960784
6  2013-02-07  group1 -0.696594

如果我像这样手动输入一系列日期,我可以正确生成我需要的数据帧:

end = pandas.datetime(2013,2,26) 
numbers2 = numbers[numbers.Date <= end] 

我不会通过详细说明此过程的其余部分来使事情复杂化——基本上,我正在按“组”对“numbers2”数据帧进行分组,并将计算结果附加到另一个数据帧,然后再继续下一个日期。

谁能指出我使用循环执行此操作的正确方法?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    首先,我认为 datelist 包含元组或类似的东西而不是日期。 在确保 datelist 包含 datetime 对象后,您可能希望过滤第一个数据帧的每条记录,并在第二个数据帧中使用相应的日期时间。 AFAIK 他们都有相同的大小。

    numbers2 = numbers[numbers.Date <= datelist.Date]
    

    你觉得怎么样,对你有用吗?

    【讨论】:

    • 谢谢,muzhig,我已经尝试过了——它与我上面发布的两行基本相同——为了我自己的可读性,我添加了变量“end”。如果我手动运行它确实有效,但不是循环运行。此外,您需要相同的大小是正确的,这也是一个问题,因为第一个日期框可能包含同一日期的多个条目,而日期列表只是日期列表。即它们的大小不能相同。感谢您的帮助 - 非常感谢。
    【解决方案2】:

    我不是 100% 确定我理解您想要什么,但我认为您想要为 datelist 中的每个日期创建一个子数据框(取自 number 数据框)。因此,在您的示例中,您想要创建 7 个数据框?

    如果是这样,我会这样做:

    首先将number(我称之为df)和datelist中的date列转成datetime64列。我假设numbers 中的日期列已经是datetime64 类型:

    print df
            date   group  number   
    0 2013-02-01  group1  -0.098765
    1 2013-02-02  group2   0.519878
    2 2013-02-03  group1  -0.098765
    3 2013-02-04  group3   1.960784
    4 2013-02-05  group3   2.859412
    5 2013-02-06  group2   1.960784
    6 2013-02-07  group1  -0.696594
    

    datelist 中,我将创建一个datetime64 类型的新列(注意我更改了日期列表中的日期,因此number 数据框中的所有dates 都小于所有日期在datelist 和我让datelist 有更少的观察以减少输出的大小):

    parse = lambda x: datetime(int(x[0]),int(x[1]),int(x[2]))
    datelist['end'] = datelist['date'].str.split(',').apply(parse)
    print datelist 
    
            date        end
    0  2013, 2,3 2013-02-03
    1  2013, 2,6 2013-02-06
    2  2013, 3,6 2013-03-06
    3  2013, 3,8 2013-03-08
    

    现在,我将循环 datelist 的行,并每次从 date &lt;= end 所在的行中创建一个新的数据框:

    pieces = []
    for idx,rows in datelist[['end']].iterrows():
      x = df[df['date'] <= rows['end']]
      x['end'] = rows['end']
      pieces.append(x)
    
    print pd.concat(pieces,ignore_index=True)
    
              date   group  number           end
    0  2013-02-01  group1  -0.098765 2013-02-03
    1  2013-02-02  group2   0.519878 2013-02-03
    2  2013-02-03  group1  -0.098765 2013-02-03
    3  2013-02-01  group1  -0.098765 2013-02-06
    4  2013-02-02  group2   0.519878 2013-02-06
    5  2013-02-03  group1  -0.098765 2013-02-06
    6  2013-02-04  group3   1.960784 2013-02-06
    7  2013-02-05  group3   2.859412 2013-02-06
    8  2013-02-06  group2   1.960784 2013-02-06
    9  2013-02-01  group1  -0.098765 2013-03-06
    10 2013-02-02  group2   0.519878 2013-03-06
    11 2013-02-03  group1  -0.098765 2013-03-06
    12 2013-02-04  group3   1.960784 2013-03-06
    13 2013-02-05  group3   2.859412 2013-03-06
    14 2013-02-06  group2   1.960784 2013-03-06
    15 2013-02-07  group1  -0.696594 2013-03-06
    16 2013-02-01  group1  -0.098765 2013-03-08
    17 2013-02-02  group2   0.519878 2013-03-08
    18 2013-02-03  group1  -0.098765 2013-03-08
    19 2013-02-04  group3   1.960784 2013-03-08
    20 2013-02-05  group3   2.859412 2013-03-08
    21 2013-02-06  group2   1.960784 2013-03-08
    22 2013-02-07  group1  -0.696594 2013-03-08
    

    我连接了数据帧,但您可以通过在“结束”上执行 groupby 来处理它们。

    【讨论】:

    • 非常感谢您,卡尔。您的理解是正确的,这使我能够做我需要做的事情。非常感谢您的帮助,以及详细的解释
    猜你喜欢
    • 2020-03-15
    • 2014-05-18
    • 1970-01-01
    • 2016-01-09
    • 2019-04-29
    • 1970-01-01
    相关资源
    最近更新 更多