Перечисления в Python не преобразуются в числа

avatar
Gerry
8 августа 2021 в 18:17
46
1
1

Приведенный ниже код работает нормально, если заменить end_day=WeekDay.SUN на end_day=6. Я не уверен, правильно ли понимаю использование Enum.

from enum import Enum, unique
from datetime import datetime
import pandas as pd

@unique
class WeekDay(Enum):
     MON = 0
     TUE = 1
     WED = 2
     THU = 3
     FRI = 4
     SAT = 5
     SUN = 6

def get_alldates(start_date, end_date, end_day=WeekDay.SUN):
    all_dts = pd.date_range(start_date, end_date, freq='d')
    weekday_dts = [x for x in all_dts if pd.to_datetime(x).weekday() == end_day]
    return weekday_dts

>>> get_alldates(datetime(2021,7,1), datetime(2021,9,1))
[]

Я думал, что WeekDay.SUN будет обработан как номер 6. Но это не так. И замена end_day=WeekDay.SUN на end_day=6 прекрасно работает.

>>> get_alldates(datetime(2021,7,1), datetime(2021,9,1))
[Timestamp('2021-07-04 00:00:00', freq='D'), Timestamp('2021-07-11 00:00:00', freq='D'), Timestamp('2021-07-18 00:00:00', freq='D'), Timestamp('2021-07-25 00:00:00', freq='D'), Timestamp('2021-08-01 00:00:00', freq='D'), Timestamp('2021-08-08 00:00:00', freq='D'), Timestamp('2021-08-15 00:00:00', freq='D'), Timestamp('2021-08-22 00:00:00', freq='D'), Timestamp('2021-08-29 00:00:00', freq='D')]

Есть идеи, почему это происходит?

Источник
norie
8 августа 2021 в 18:22
0

Попробуйте добавить value после Weekday.SUN.

Gerry
8 августа 2021 в 18:26
0

@norie ты имеешь в виду end_day.value?

norie
8 августа 2021 в 18:27
0

Weekday.SUN.value.

Gerry
8 августа 2021 в 18:30
0

Это работает, но я не понимаю, почему end_day.value или просто end_day не работает.

norie
8 августа 2021 в 18:35
0

Честно говоря, я тоже не знаю - как-то странно. Кто-то задал тот же вопрос здесь reddit.com/r/Python/comments/8oisf2/…

mkrieger1
8 августа 2021 в 18:52
1

Вместо этого используйте IntEnum: Разница между Enum и IntEnum в Python

Gerry
8 августа 2021 в 22:57
0

@mkrieger1 спасибо. работает как шарм

Ответы (1)

avatar
Ethan Furman
8 августа 2021 в 19:37
2

Перечисления не преобразуются в числа, потому что перечисления - это не числа, а имена. Они могут быть и обычно поддерживаются числами, и доступ к этим числам можно получить с помощью атрибута .value.

Обратите внимание, что резервное значение не обязательно должно быть числом — это может быть str, tuple, dict и т. д.

Если вам нужно, чтобы члены перечисления действовали как числа, вам нужно наследовать от соответствующего типа данных:

class WeekDay(int, Enum):
    pass

тогда WeekDay.SUN == 6 будет True.