【问题标题】:dealing with numpy array and dataframe columns处理 numpy 数组和数据框列
【发布时间】:2021-08-16 16:51:45
【问题描述】:

我有以下数据框:

dates,values
2014-10-01 00:00,10.606
2014-10-01 01:00,10.595
2014-10-01 02:00,10.583
2014-10-01 03:00,10.572
2014-10-01 04:00,10.56
2014-10-01 05:00,10.564
2014-10-01 06:00,10.65
2014-10-01 07:00,10.801
2014-10-01 08:00,10.977
2014-10-01 09:00,11.316
2014-10-01 10:00,11.88
2014-10-01 11:00,12.427
2014-10-01 12:00,12.751
2014-10-01 13:00,12.863
2014-10-01 14:00,12.823
2014-10-01 15:00,12.686
2014-10-01 16:00,12.499
2014-10-01 17:00,12.293
2014-10-01 18:00,12.086
2014-10-01 19:00,11.89
2014-10-01 20:00,11.712
2014-10-01 21:00,11.552
2014-10-01 22:00,11.413
2014-10-01 23:00,11.292
2014-10-02 00:00,11.188
2014-10-02 01:00,11.1

假设我想选择与特定日期相关的所有数据。在这种情况下。例如 2014 年 10 月 1 日。这些是我的代码中使用的操作:

dfr       =  pd.read_csv(f_name, parse_dates=True,index_col=0,
                                       infer_datetime_format=True)

yy  = dfr [dfr.index.floor('D')  == ' 2014-10-01 00:00:00'].to_numpy()

这是我得到的:

array([[10.606],
       [10.595],
       [10.583],
       [10.572],
       [10.56 ],
       [10.564],
       [10.65 ],
       [10.801],
       [10.977],
       [11.316],
       [11.88 ],
       [12.427],
       [12.751],
       [12.863],
       [12.823],
       [12.686],
       [12.499],
       [12.293],
       [12.086],
       [11.89 ],
       [11.712],
       [11.552],
       [11.413],
       [11.292]])

但是,我希望 yy 采用以下形式:

array([10.606,10.595,10.583,10.572,10.56 ,10.564,10.65 ,10.801,10.977, 11.316,11.88 ,12.427,12.751,12.863,12.823,12.686,12.499,12.293,12.086,11.89 ,11.712,11.552,11.413,11.292])

确实,我必须使用另一个向量 xx,即:

xx=array([ 2.91833891,  2.84972246,  0.50386982,  5.35302713,  4.81822114,
        3.33330121,  5.63819964, 11.20447123, 12.98512414,  9.95449998,
        5.78945234,  9.90594599,  1.25708361,  3.02603884,  1.02683686,
        3.84912813,  1.55641116, 13.04097404,  9.6277124 , 10.73849736,
        5.39958019,  3.43633323, 13.5965677 ,  7.31914519])

这将帮助我在不处理循环的情况下使用 np.sum 等。

提前致谢

【问题讨论】:

  • 您需要将您想要的列指定为数组,即dfr[dfr.index.floor('D') == ' 2014-10-01 00:00:00']['values'].to_numpy()
  • 使用日期时间过滤:df[df['dates'].dt.date == datetime.date(year=2014, month=10, day=1)]['values'].tolist()

标签: python arrays pandas numpy


【解决方案1】:

使用loc:

yy=dfr.loc[dfr.index.floor('D')  == ' 2014-10-01 00:00:00','values'].to_numpy()

使用flatten():

yy=dfr[dfr.index.floor('D')  == ' 2014-10-01 00:00:00'].to_numpy().flatten()
#yy=dfr[dfr.index.floor('D')  == ' 2014-10-01 00:00:00'].to_numpy().ravel()

【讨论】:

    【解决方案2】:

    另一种解决方案,使用df.loc 只选择一列:

    yy = dfr.loc[
        dfr.index.floor("D") == " 2014-10-01 00:00:00", "values"
    ].to_numpy()
    print(yy)
    

    打印:

    [10.606 10.595 10.583 10.572 10.56  10.564 10.65  10.801 10.977 11.316
     11.88  12.427 12.751 12.863 12.823 12.686 12.499 12.293 12.086 11.89
     11.712 11.552 11.413 11.292]
    

    【讨论】:

    • 这么快,我只是改变了我的答案,先生您发布了 :)
    【解决方案3】:

    实际上你需要的是一个系列而不是一个数据帧:

    1. 在文件级别,使用squeeze=True参数读取csv:
    dfr = pd.read_csv(f_name, parse_dates=True,index_col=0,
                      infer_datetime_format=True, squeeze=True)
    
    1. 使用numpyravel函数:
    >>> dfr[dfr.index.floor('D')  == ' 2014-10-01 00:00:00'].to_numpy().ravel()
    
    array([10.606, 10.595, 10.583, 10.572, 10.56 , 10.564, 10.65 , 10.801,
           10.977, 11.316, 11.88 , 12.427, 12.751, 12.863, 12.823, 12.686,
           12.499, 12.293, 12.086, 11.89 , 11.712, 11.552, 11.413, 11.292])
    
    1. 使用@AnuragDabas 或@AndrejKesely 提出的解决方案之一。

    【讨论】:

      猜你喜欢
      • 2018-08-27
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多