Значение даты в стеке панд

1

Формат моих данных:

year month 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 .. 31
1998 1 2.5 1 - - -2.5 - - - - - - - - - - - - - - 1.5
1998 2 2.5 1 - - -4.5 - - - - - - - - - - - - - - 1.5
1998 3 2.5 1 - - -3.5 - - - - - - - - - - - - - - 1.5
1998 4 2.5 1 - - -8.5 - - - - - - - - - - - - - - 1.5
1998 5 2.5 1 - - -1.5 - - - - - - - - - - - - - - 1.5
2001 5 2.5 1 - - -1.5 - - - - - - - - - - - - - - 1.5

объяснение:

- означает недостающее значение.

year - год.

month месяц.

1 2 3 4 и т.д. - это столбец дня, поэтому это матрица формата даты и времени.

Ожидайте выход:

date value
1998-01-01 2.5
1998-01-02 2.8
1998-01-03 - # when is ismissing and the date is exist it show
1998-01-31 - 
...
2008-02-28 - #
2008-02-29 - # this year the Febulary get 29 days
2008-03-01 3.4 
...
2008-04-30 - # missing value and the date exist.
2008-05-01 3.0
Теги:
pandas
python-3.x
datetime

1 ответ

1
Лучший ответ

Очень многое, о чем вы просите, это "un-pivot", ваш DataFrame. Общий подход к этим типам проблем unstack использовании некоторой версии melt, stack или unstack. Вот подход, использующий stack.

Настроить

df = pd.DataFrame({'year': {0: 1998, 1: 1998, 2: 1998, 3: 1998, 4: 1998, 5: 2001}, 'month': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 5}, '1': {0: 2.5, 1: 2.5, 2: 2.5, 3: 2.5, 4: 2.5, 5: 2.5}, '2': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1}, '3': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '4': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '5': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '6': {0: 2.5, 1: 4.5, 2: 3.5, 3: 8.5, 4: 1.5, 5: 1.5}, '7': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '8': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '9': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '10': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '11': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '12': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '13': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '14': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '15': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}})

Использование stack:

out = df.set_index(['year', 'month']).stack().reset_index()

pd.DataFrame({
    'Date': pd.to_datetime(out.iloc[:, :3].astype(str).agg('-'.join, 1)),
    'Value': out.iloc[:, 3]
})

        Date Value
0  1998-01-01   2.5
1  1998-01-02     1
2  1998-01-03     -
3  1998-01-04     -
4  1998-01-05     -
5  1998-01-06   2.5
..        ...   ...
60 1998-05-01   2.5
61 1998-05-02     1
83 2001-05-09     -
84 2001-05-10     -
85 2001-05-11     -
86 2001-05-12     -
87 2001-05-13     -
88 2001-05-14     -
89 2001-05-15     -
  • 0
    Спасибо за вашу помощь, и я должен отметить, что этот ответ не проверяет дату, код вроде pd.to_datetime(date_index, infer_datetime_format=True, errors='coerce').notna() может помочь отфильтровать эти инвазированные данные.

Ещё вопросы

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