Значения подстановки Python для панд на основе метки времени

1

У меня есть pandas DataFrame, который выглядит примерно так:

 product month
 apple  Jan-18
 pear   Jan-18
 banana Jan-18
 apple  Jan-18
 pear   Feb-18
 apple  Feb-18
 banana Feb-18

Я создал свою собственную таблицу ссылок, которая выглядит так:

id product     start       end    weight
1  apple    01/01/2011  31/01/2018 heavy
1  apple    01/02/2018  31/12/2020 small
2  banana   01/01/2015  31/01/2018 heavy
2  banana   01/02/2018  31/12/2020 small
3  pear     01/01/2016  31/12/2020 heavy

Справочная таблица всегда начинается с первого и последнего дней месяца. Поле "вес" медленно меняется со временем. Например, яблоко и банан со временем менялись. Дата 31/12/2020 означает, что в настоящее время это активный размер продукта.

Мне нужно объединить "вес" в справочной таблице с моим DataFrame для продукта в зависимости от отметки времени. Мне нужно это сделать:

 product month weight
 apple  Jan-18 heavy
 pear   Jan-18 heavy
 banana Jan-18 heavy
 apple  Jan-18 heavy
 pear   Feb-18 heavy
 apple  Feb-18 small
 banana Feb-18 small

Моя трудность заключается в том, что я не знаю, с чего начать. Поля даты в моей DataFrame и справочной таблице: datetime64 [ns]

Теги:
pandas
timestamp

1 ответ

0

Создайте новый столбец в ref_df, имеющий аналогичную структуру в виде столбца месяца ref_df

Объедините два кадра данных в только что созданной колонке

def month_conversion(x):
    month_list = ['Jan','Feb','Mar','Apr','May','June','July','Aug','Sep','Oct','Nov','Dec']
    return month_list[int(x.month)-1] 

ref_df['year'] = ref_df['start'].head().map(lambda x: str(x.year)[-2:])

ref_df['month'] = ref_df.loc[0:5,'start'].map(month_conversion)

ref_df['common_key'] = ref_df['month'] +'-' +ref_df['year']
my_df['month'] = my_df['month'].astype(str)
final_df = ref_df.merge(my_df,left_on=['common_key','product'],right_index=['month','product'],suffixes=('_merge',''))
  • 0
    Я получаю следующее: TypeError: индексы списка должны быть целыми числами или ломтиками, а не с плавающей точкой для возврата month_list [x.month-1]
  • 0
    мой плохой это означает, что x.month является float. Просто сделайте month_list [int (x.month) -1]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню