Рассмотрим пример со следующими данными:
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
работает корректно за кулисами, поскольку это соответствует високосным годам.