代码之家  ›  专栏  ›  技术社区  ›  Ivan

给定一个DatetimeIndex和一组datetime感知记录,如何创建一个数据帧?

  •  1
  • Ivan  · 技术社区  · 6 年前

    我有一个预定义的DatetimeIndex和一个元组列表:(datetime,float,float,float)。我需要创建一个Pandas数据框并用列表中的数据填充它。不用说,每个记录的第一个元素(元组)定义了它在结果数据帧中的假定位置,而不是列的值,结果数据帧中只有3个浮点列。DatetimeIndex中没有匹配元素的记录应该被丢弃(我不介意在这种情况下出现错误)。

    给定元组本身的列表 pd.DataFrame.from_records() 将元组的每个元素视为列的值(如果列列表中没有包含datetime列,则会引发错误)。

    给定一本定义为 {r[0]: (r[1], r[2], r[3]) for r in rs} (其中 rs pd.DataFrame.from\ u records() 返回一个数据帧,其中每列的每个字段中的每个值都是NaN。我也试过用列表代替元组( {r[0]: [r[1], r[2], r[3]] for r in rs} )但结果是一样的。我已经仔细检查过了-源元组中的值基本上都是已定义的浮点值,没有nan或none。设置 coerce_float 不会改变什么。

    {r[0]: {'A': r[1], 'B': r[2], 'C': r[3]} for r in rs} )结果是一样的——都是南。

    更新:下面是一个例子:

    dts = [
        datetime(2018, 1, 1, 0, 0, 0, 0, timezone.utc),
        datetime(2018, 1, 2, 0, 0, 0, 0, timezone.utc),
        datetime(2018, 1, 3, 0, 0, 0, 0, timezone.utc)
    ]
    
    dti = pd.DatetimeIndex(dts, tz=timezone.utc)
    
    rs = [
        (datetime(2018, 1, 1, 0, 0, 0, 0, timezone.utc), 0.1, 0.2, 0.3),
        (datetime(2018, 1, 2, 0, 0, 0, 0, timezone.utc), 0.4, 0.5, 0.6),
        (datetime(2018, 1, 3, 0, 0, 0, 0, timezone.utc), 0.7, 0.8, 0.9)
    ]
    
    # ...
    
    dtf = pd.DataFrame.from_records(rs, index=dti, columns=['A', 'B', 'C'], coerce_float=True)
    
    print(dtf)
    

    应该导致

                               A    B    C  
    2008-01-01 00:00:00+00:00  0.1  0.2  0.3
    2008-01-02 00:00:00+00:00  0.3  0.5  0.6
    2008-01-03 00:00:00+00:00  0.7  0.8  0.9
    

    AssertionError: 3 columns passed, passed data had 4 columns 如果你跑这条路。我应该写什么来代替 # ... from_records 在给定输入的情况下达到预期的结果?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Alexander    6 年前

    假设给定的datetime索引命名为 dti dti公司 :

    df = pd.DataFrame(rs, columns=['datetime', 'A', 'B', 'C'])
    >>> df.set_index('datetime').reindex(dti)
                  A    B    C
    2018-01-01  0.1  0.2  0.3
    2018-01-02  0.3  0.5  0.6
    2018-01-03  0.7  0.8  0.9
    
        2
  •  1
  •   RGMyr    6 年前

    您给出的dict理解可能会给出按Datetimes命名的列,而不是按Datetimes索引的行。撇开这一点不谈,如果您可以创建一个包含4列的数据帧,那么您应该能够使用 DataFrame.set_index DataFrame.reindex 按给定的索引 DatetimeIndex .

    也可以先创建DataFrame,然后在循环中填充列。这个 DataFrame.loc 索引器将抛出 KeyError

    df = pd.DataFrame(index=my_datetime_index, columns=['val1', 'val2', 'val3'])
    for r in rs:
        try:
            df.loc[r[0]] = r[1:]
        except KeyError:
            pass