Добавить недостающие строки даты и времени и проверить дубликаты - PullRequest
1 голос
/ 30 января 2020

Я относительно новичок в pandas, и я надеюсь, что вы могли бы помочь мне; -)

Я хочу сгруппировать pandas фрейм данных по name_id и datetime, добавив также пропущенные значения даты и времени (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...] 

I нашел похожий случай здесь, но он не работает для меня, когда я применяю эту часть кода, он удаляет мой столбец name_id: - (

Группировать и заполнять отсутствующие значения даты и времени дубликатами ?

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

Заранее спасибо!

1 Ответ

0 голосов
/ 30 января 2020
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
...