Pandas 按日期迭代数据帧的正确方法

Pandas 按日期迭代数据帧的正确方法,pandas,dataframe,iteration,Pandas,Dataframe,Iteration,我想逐日期迭代数据帧的长轴 示例: tdf=df.ix[日期] 我遇到的问题是,df.ix返回的类型发生了变化,给我留下了3种可能的情况 如果日期不存在于tdf中,则抛出一个错误:KeyError:1394755200000000 如果tdf中只有一项:打印类型(tdf)返回 如果tdf中有多个项目:打印类型(tdf)返回 为了避免第一种情况,我可以简单地将其包装在try-catch块中,或者感谢jxstanford,我可以通过使用df.index:if-date来避免try-catc

我想逐日期迭代数据帧的长轴

示例:

tdf=df.ix[日期]

我遇到的问题是,
df.ix
返回的类型发生了变化,给我留下了3种可能的情况

  • 如果日期不存在于
    tdf
    中,则抛出一个错误:
    KeyError:1394755200000000

  • 如果
    tdf
    中只有一项:
    打印类型(tdf)
    返回

  • 如果
    tdf
    中有多个项目:
    打印类型(tdf)
    返回

  • 为了避免第一种情况,我可以简单地将其包装在
    try-catch
    块中,或者感谢jxstanford,我可以通过使用df.index:if-date来避免try-catch块

    后来,我遇到了一个与pandas系列和pandas数据帧不一致的API问题。我可以通过检查类型来解决这个问题,但似乎我不应该这样做。理想情况下,我希望保持类型不变。有更好的方法吗

    我正在运行pandas 0.13.1,目前正在使用CSV加载数据

    这里有一个完整的例子来说明这个问题

    from pandas import DataFrame
    import datetime
    
    path_to_csv = '/home/n/Documents/port/test.csv'
    
    df = DataFrame.from_csv(path_to_csv, index_col=3, header=0, parse_dates=True, sep=',')
    
    start_dt = df.index.min()
    end_dt = df.index.max()
    dt_step = datetime.timedelta(days=1)
    
    df.sort_index(inplace=True)
    
    cur_dt = start_dt
    
    while cur_dt != end_dt:
        if cur_dt in df.index:
           print type(df.ix[cur_dt])
        #run some other steps using cur_dt
    
        cur_dt += dt_step
    
    演示该问题的示例如下所示:

    value1,value2,value3,Date,type
    1,2,4,03/13/14,a
    2,3,3,03/21/14,b
    3,4,2,03/21/14,a
    4,5,1,03/27/14,b
    
    上面的代码打印出来

    <class 'pandas.core.series.Series'>
    <class 'pandas.core.frame.DataFrame'>
    

    不确定您试图对数据帧做什么,但这可能比尝试/例外要好:

    tdf = DataFrame.from_csv(path_to_csv, index_col=3, header=0, parse_dates=True, sep=',')
    while cur_dt != end_dt:
        if cur_dt in df.index:
           # do your thing
    
        cur_dt += dt_step
    

    您可以使用数据框的
    apply
    方法,使用
    axis=1
    处理数据框的每一行,以构建具有相同索引的系列

    e、 g

    修改示例输入,如下所示

                value1  value2  value3 type  NewValue       date
    Date
    2014-03-13       1       2       4    a         7 2014-03-13
    2014-03-21       2       3       3    b         0 2014-03-21
    2014-03-21       3       4       2    a         0 2014-03-21
    2014-03-27       4       5       1    b        20 2014-03-27
    
    [4 rows x 6 columns]
    

    这个玩具代码将一致地返回数据帧

    def framer(rows):
        if ndim(rows) == 1:
            return rows.to_frame().T
        else:
            return rows
    
    for cur_date in df.index:
        print type(framer(df.ix[cur_date]))
    
    这将给你失去的日子:

    df.resample(rule='D')
    

    请看一下重采样方法docstring。它有自己的选项来填充丢失的数据。如果您决定将多个日期合并为一个日期,那么您正在使用的方法是分组方式(如果您希望跨行合并值)和删除重复的日期(如果您希望忽略它们)。无需重新设计轮子。

    您可以使用
    unique
    获得所有日期的唯一列表,然后迭代该列表。@KarlD。我需要其他内容的所有日期,而不仅仅是数据框中缺少的唯一值。请尝试使用dataframe.from_csv而不是pandas.read_csv。这可能有助于解决问题2和问题3。您确实需要提供更多细节,一个玩具数据集供初学者使用。您将获得的行为是预期的:如果您提取一行,您将获得一个系列(一维数组),如果您提取多行,它将是一个数据帧(二维数组)。如果你告诉熊猫去寻找不存在的东西,它会给你一个错误。如果你解释了你想要的结果(一个专栏?更多专栏?),有很多方法可以解决所有这些问题。@jxstanford谢谢我尝试了你的建议,我仍然遇到同样的问题,这确实有帮助!但我遇到了其他问题,我会更新这个问题
    def framer(rows):
        if ndim(rows) == 1:
            return rows.to_frame().T
        else:
            return rows
    
    for cur_date in df.index:
        print type(framer(df.ix[cur_date]))
    
    df.resample(rule='D')