【问题标题】:Add missing datetime rows and check duplicates添加缺少的日期时间行并检查重复项
【发布时间】:2020-05-16 01:54:49
【问题描述】:

我对 pandas 比较陌生,希望你能帮帮我;-)

我想按 name_iddatetime 对 pandas 数据框进行分组,同时添加缺少的日期时间值 (NaN)。

输入示例:

name_id   datetime          value
 A      23/01/2020 0:00:00   100
 A      23/01/2020 1:00:00   98
 A      23/01/2020 2:00:00   96
 A      23/01/2020 3:00:00   99
 A      23/01/2020 3:00:00   99
 A      23/01/2020 4:00:00   98
 A      23/01/2020 5:00:00   99
 B      23/01/2020 0:00:00   144
 B      23/01/2020 1:00:00   324
 B      23/01/2020 2:00:00   367
 B      23/01/2020 3:00:00   368
 B      23/01/2020 6:00:00   364

首先,我需要根据name_id 完成缺失的日期时间值。如果某一天(00:00 到 23:00)有任何缺失的时间,请添加该小时的新行和对应的 Nan '值'。

我还需要删除重复项。由于时间变化,有些日子可能是 25 小时,所以我需要在这个小时/天和name_id 删除它们。

输出是这样的:

name_id         date              v                    
   A           2020-01-23    [132, 76, 56, 77, 81, 100, NaN, Nan, ......]    
   B           2020-01-23    [44, 24, 165, 267, NaN, Nan, 263, Nan, Nan...] 

我在这里发现了一个类似的案例,但是当我应用这部分代码时它对我不起作用,它删除了我的 name_id 列:-(

Group by and fill missing datetime values with duplicates?

df1 = (
    df.reset_index('name_id')
    .groupby('name_id')['value']
    .apply(f)
    .reset_index()
)                                    

提前致谢!

【问题讨论】:

    标签: pandas python-2.7 pandas-groupby


    【解决方案1】:
    def fill_datetimes(df):
        daterange = pd.date_range(
            df.index.min().floor('d'), 
            df.index.max().floor('d')+pd.Timedelta(23, 'h'), 
            freq='H', name='datetime')
        # if you only want to de-duplicate on datetime, 
        # use `df.drop_duplicates("datetime").reindex(daterange)`
        return df.drop_duplicates().reindex(daterange)
    
    filled_df = df.set_index("datetime")\
        .groupby('name_id')['value']\
        .apply(fill_datetimes)\
        .reset_index()
    
    filled_df.groupby(
        ['name_id', 
         pd.Grouper(key='datetime', freq='D')]
    )['value'].apply(list)
    

    输出:

    name_id  datetime  
    A        2020-01-01    [2.0, nan, nan, nan, 29.0, nan, 68.0, 83.0, 99...
    B        2020-01-01    [nan, 42.0, 45.0, 99.0, nan, 11.0, nan, nan, n...
    Name: value, dtype: object
    

    【讨论】:

      猜你喜欢
      • 2021-10-20
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 2017-10-04
      相关资源
      最近更新 更多