как pandas strftime% j? - PullRequest
       45

как pandas strftime% j?

0 голосов
/ 06 августа 2020

У меня есть относительно большой набор данных о погоде за 10 лет, и я хочу сгруппировать по дням года, чтобы получить 10-летний минимум или максимум для каждого дня, поэтому для использования groupby я создал столбец в этом способ:

df['dms'] = df['Date'].dt.strftime('%j')

дело в том, что когда я использую dt.strftime('%j'), я получаю два числа за один и тот же день, что странно, например, когда я фильтрую только по De c 31st, а я делаю value_counts() I получите это:

365    363
366     82
Name: dms, dtype: int64

с другой стороны, все работает нормально, если я сделал dt.strftime('%m-%d)

Dec-31    445
Name: dm, dtype: int64

Я даже сделал dt.strftime('%b-%d-%r').value_counts() и получил такой же правильный фильтр

Dec-31-12:00:00 AM    445
Name: Date, dtype: int64

что на самом деле идет не так (или, чтобы звучало менее новоb ie), что происходит за кулисами в случае %j

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

Рассмотрим пример со следующими данными:

df = pd.DataFrame({'Date' : ['2016-12-31', '2017-12-31', '2018-12-31', '2019-12-31', '2020-12-31']})
df['Date'] = pd.to_datetime(df['Date'])
df

    Date
0   2016-12-31
1   2017-12-31
2   2018-12-31
3   2019-12-31
4   2020-12-31

В приведенных выше данных 2016 и 2020 - високосные годы с дополнительным днем ​​29 февраля, чтобы компенсировать этот факт. что фактический год составляет 365 дней и восемь часов (так что каждый четвертый год существует високосный год / високосный день, потому что мы берем сумму дополнительных восьми часов за предыдущие 3 года (3 х 8 = 24), и это почему у нас високосный день!), поэтому мы должны ожидать возврата 366 с %j для указанных лет, когда мы делаем:

import pandas as pd
df = pd.DataFrame({'Date' : ['2016-12-31', '2017-12-31', '2018-12-31', '2019-12-31', '2020-12-31']})
df['Date'] = pd.to_datetime(df['Date'])
df['Day'] = df['Date'].dt.strftime('%j')
df

    Date        Day
0   2016-12-31  366
1   2017-12-31  365
2   2018-12-31  365
3   2019-12-31  365
4   2020-12-31  366

Однако, когда вы делаете value_counts(), он возвращается:

365    3
366    2
Name: Day, dtype: int64

Это также ожидаемое поведение, поэтому %j работает корректно за кулисами, поскольку это соответствует високосным годам.

0 голосов
/ 06 августа 2020

% j возвращает номер дня в году 001-366 (366 для високосного года, 365 в противном случае). Поскольку ваши данные охватывают 10 лет, в високосном году будет 366 дней.

...