Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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_Pandas - Fatal编程技术网

Python 在数据框中填写缺失的小时数

Python 在数据框中填写缺失的小时数,python,pandas,Python,Pandas,我有一个包含每小时数据的数据框: area date hour output H1 2018-07-01 07:00:00 150 H1 2018-07-01 08:00:00 150 H1 2018-07-01 09:00:00 100 H1 2018-07-01 11:00:00 150 H2 2018-07-01 09:00:00 100 H2 2018-

我有一个包含每小时数据的数据框:

area     date         hour      output
H1       2018-07-01   07:00:00  150
H1       2018-07-01   08:00:00  150
H1       2018-07-01   09:00:00  100
H1       2018-07-01   11:00:00  150
H2       2018-07-01   09:00:00  100
H2       2018-07-01   10:00:00   50
H2       2018-07-01   11:00:00   50
H2       2018-07-01   12:00:00  150
但数据只包含有输出时的小时数行,如何用输出0填充每个区域缺少的小时数?例如,为H1添加两行:

area     date         hour      output
H1       2018-07-01   10:00:00  0
H1       2018-07-01   12:00:00  0
我可以假设所有区域的最小和最大小时是采样周期的开始和结束(在本例中为7:00:00和12:00:00)

现在,我正在为每个区域创建一个包含从7:00到12:00所有时间的数据框,然后将我的数据与该数据框合并,然后用0填充NaN。这非常慢,因为我的数据集可能有数百万行


有更好的方法吗?

您可以使用
groupby

df['Datetime']=pd.to_datetime(df.date+' '+df.hour)# combine hour and date to datetime 

df.drop(['date','hour'],inplace=True,axis = 1)# drop duplicate infomation
df.groupby('area').\
    apply(lambda x : x.set_index('Datetime').resample('H').mean().fillna(0)).\
      reset_index()
Out[662]: 
  area            Datetime  output
0   H1 2018-07-01 07:00:00   150.0
1   H1 2018-07-01 08:00:00   150.0
2   H1 2018-07-01 09:00:00   100.0
3   H1 2018-07-01 10:00:00     0.0
4   H1 2018-07-01 11:00:00   150.0
5   H2 2018-07-01 09:00:00   100.0
6   H2 2018-07-01 10:00:00    50.0
7   H2 2018-07-01 11:00:00    50.0
8   H2 2018-07-01 12:00:00   150.0

您可以创建一个最小和最大的日期范围,将数据框与现有数据框合并,并使用null填充值

df

输出:

只要源日期/时间是从 一个测量日

如果源包含不同日期的读数,则重新采样的结果 对于每个区域,从第一天最早的读数到最晚的读数 在最后一天阅读,包括夜间中间时间,是什么 可能不是你想要的

此解决方案的另一个缺点是它不提供“零”读数 从测量日开始,但从最早的读数开始。 这同样适用于“最终”阅读,也不一定是在文章末尾 测量日

我的解决方案没有这些缺点,基于以下假设:

  • 保留“源日期”列,因为以后需要它。 计算Datetime后,仅删除小时列
  • 生成包含NaN读数的df_borders数据帧,用于 对于每个区域和日期,我假设测量日为07:00:00和13:00:00
  • 将上述NaN读数添加到主数据框中,并删除每个数据框的重复读数 区域/日期时间。这样,每个区域/天的源数据包含 每天开始/结束时的准确读数,可以是原始读数,也可以是从中添加的读数 df_边界
  • 为避免“非工作日”读数,必须在 ['区域','日期']。这就是为什么我现在才离开日期栏
  • 现在不需要date列,可以删除它
  • 最后一步是打印结果
  • 下面是示例程序:

    import pandas as pd
    
    df = pd.read_csv('Input.csv')
    
    # Generate df_borders - NaN readings for start / end of each area / date
    df_start = df[['area','date']].drop_duplicates()
    df_end = df_start.copy()
    df_start['hour'] = '07:00:00'
    df_end['hour'] = '13:00:00'
    df_borders = pd.concat([df_start,df_end])
    
    # Compute Datetime column and drop hour column, for both DataFrames
    df['Datetime'] = pd.to_datetime(df.date + ' ' + df.hour)
    df.drop('hour', inplace=True, axis = 1)
    df_borders['Datetime'] = pd.to_datetime(df_borders.date + ' ' + df_borders.hour)
    df_borders.drop('hour', inplace=True, axis = 1)
    
    # Add NaN readings
    df = df.append(df_borders, sort=False, ignore_index=True)\
        .drop_duplicates(subset=['area', 'Datetime'])
    
    # Generate the full set of readings
    df = df.groupby(['area', 'date'])\
        .apply(lambda x : x.set_index('Datetime').resample('H').mean().fillna(0))\
        .reset_index()
    df.drop('date', inplace=True, axis = 1)
    
    # Result
    print(df)
    
    有些部分是温家宝解决方案的副本,以避免重新发明轮子

    对于源数据:

    area,date,hour,output
    H1,2018-07-01,07:00:00,150
    H1,2018-07-01,08:00:00,120
    H1,2018-07-01,09:00:00,90
    H1,2018-07-01,11:00:00,130
    H2,2018-07-01,09:00:00,110
    H2,2018-07-01,10:00:00,50
    H2,2018-07-01,11:00:00,80
    H2,2018-07-01,12:00:00,110
    H2,2018-07-02,08:00:00,40
    H2,2018-07-02,09:00:00,65
    H2,2018-07-02,11:00:00,95
    H2,2018-07-02,12:00:00,45
    
    它打印:

       area            Datetime  output
    0    H1 2018-07-01 07:00:00   150.0
    1    H1 2018-07-01 08:00:00   120.0
    2    H1 2018-07-01 09:00:00    90.0
    3    H1 2018-07-01 10:00:00     0.0
    4    H1 2018-07-01 11:00:00   130.0
    5    H1 2018-07-01 12:00:00     0.0
    6    H1 2018-07-01 13:00:00     0.0
    7    H2 2018-07-01 07:00:00     0.0
    8    H2 2018-07-01 08:00:00     0.0
    9    H2 2018-07-01 09:00:00   110.0
    10   H2 2018-07-01 10:00:00    50.0
    11   H2 2018-07-01 11:00:00    80.0
    12   H2 2018-07-01 12:00:00   110.0
    13   H2 2018-07-01 13:00:00     0.0
    14   H2 2018-07-02 07:00:00     0.0
    15   H2 2018-07-02 08:00:00    40.0
    16   H2 2018-07-02 09:00:00    65.0
    17   H2 2018-07-02 10:00:00     0.0
    18   H2 2018-07-02 11:00:00    95.0
    19   H2 2018-07-02 12:00:00    45.0
    20   H2 2018-07-02 13:00:00     0.0
    

    根据需要,一系列7个读数,用于3个区域/日期对。

    您可以使用
    df.fillna(0)
    area,date,hour,output
    H1,2018-07-01,07:00:00,150
    H1,2018-07-01,08:00:00,120
    H1,2018-07-01,09:00:00,90
    H1,2018-07-01,11:00:00,130
    H2,2018-07-01,09:00:00,110
    H2,2018-07-01,10:00:00,50
    H2,2018-07-01,11:00:00,80
    H2,2018-07-01,12:00:00,110
    H2,2018-07-02,08:00:00,40
    H2,2018-07-02,09:00:00,65
    H2,2018-07-02,11:00:00,95
    H2,2018-07-02,12:00:00,45
    
       area            Datetime  output
    0    H1 2018-07-01 07:00:00   150.0
    1    H1 2018-07-01 08:00:00   120.0
    2    H1 2018-07-01 09:00:00    90.0
    3    H1 2018-07-01 10:00:00     0.0
    4    H1 2018-07-01 11:00:00   130.0
    5    H1 2018-07-01 12:00:00     0.0
    6    H1 2018-07-01 13:00:00     0.0
    7    H2 2018-07-01 07:00:00     0.0
    8    H2 2018-07-01 08:00:00     0.0
    9    H2 2018-07-01 09:00:00   110.0
    10   H2 2018-07-01 10:00:00    50.0
    11   H2 2018-07-01 11:00:00    80.0
    12   H2 2018-07-01 12:00:00   110.0
    13   H2 2018-07-01 13:00:00     0.0
    14   H2 2018-07-02 07:00:00     0.0
    15   H2 2018-07-02 08:00:00    40.0
    16   H2 2018-07-02 09:00:00    65.0
    17   H2 2018-07-02 10:00:00     0.0
    18   H2 2018-07-02 11:00:00    95.0
    19   H2 2018-07-02 12:00:00    45.0
    20   H2 2018-07-02 13:00:00     0.0