Как использовать DateTimeIndex в качестве входных данных для именованной функции в apply () через DataFrame Pandas - PullRequest
0 голосов
/ 14 мая 2018

У меня DateTimeIndex, состоящий из 15-минутных интервалов.

У меня также есть та же функция, написанная двумя способами, которую я хочу применить ко всему фрейму данных.Смысл функции в том, чтобы узнать, является ли конкретный день рабочим днем ​​или нет.

Вот они:

def weekend(datum):
    if (datum.weekday() == 5) or (datum.weekday() == 6):
        return "Weekend"
    else:
        return "Working day"
 # written with being fed the DateTimeIndex in mind


def weekendfromnumber(number):
    if (number == 5) or (number == 6):
        return "Weekend"
    else:
        return "Working day"
# written with being fed the integer of the intermediate columng weekday in mind

Я хотел применить первую функцию, напрямую передав ее DateTimeIndexкак в:

df15['Type of day'] = df15.index.apply(weekend)

но я получаю ошибку:

AttributeError: 'DatetimeIndex' object has no attribute 'apply'

Если я использую вторую функцию, как в:

df15['Type of day'] = df15.weekday.apply(weekendfromnumber)

Я получаю эффект, которыйЯ хочу, но за счет необходимости создать промежуточный столбец с именем дня недели с:

df15['weekday'] = df15.index.weekday

Поскольку я не хочу промежуточный столбец, я подумал, что делать что-то вроде:

df15['Type of day'] = df15.index.weekday.apply(weekendfromnumber) 

будет работать, но вместо этого я получаю ошибку

AttributeError: 'numpy.ndarray' object has no attribute 'apply'

Итак, главный вопрос:

Как использовать данные, которые уже есть в DateTimeIndex, и передать их впользовательская функция, использующая apply ()?

1 Ответ

0 голосов
/ 14 мая 2018

Вы можете создать временный pd.Series для вашего индекса даты и времени, но почему бы просто не использовать np.where, поскольку здесь он намного быстрее:

df15['Type of day'] = np.where(df15.index.weekday > 5, "Weekend", "Working Day")

Если ваша функция сложная и вы не можете использовать np.where вызовите to_series() first:

df15['Type of day'] = df15.index.to_series().apply(weekend)

Время:

Протестировано с фиктивным кадром данных со 100 строками и одним столбцом:

df = pd.DataFrame(np.random.rand(100,1), 
                  index=pd.DatetimeIndex(freq='D', 
                                         start='2017-01-01',
                                         periods=100))

In [1]: %timeit df.index.to_series().apply(weekend)
1.11 ms ± 127 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [2]: %timeit np.where(df.index.weekday > 5, "Weekend", "Weekday")
192 µs ± 45.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...