Что такое гранулярность вычислений времени в pandas? - PullRequest
1 голос
/ 16 марта 2020

У меня есть следующий набор данных

df = pd.DataFrame({'timestamp': pd.date_range('1/1/2020', '3/1/2020 23:59', freq='12h'), 
                   'col1': np.random.randint(100,size=122)}).\
                  sort_values('timestamp')

Я хочу вычислить ежедневную, еженедельную и месячную сумму col1. Если я использую гранулярность 'W' для столбца timestamp, я получаю ошибку ValueError: ValueError: <Week: weekday=6> is a non-fixed frequency и читаю, что рекомендуется использовать 7D, 30D et c.
Мой вопрос: pandas вычислить 7D или 30D гранулярность? Если я добавлю еще один столбец

df['timestamp2']= df.timestamp.dt.floor('30D')
df.groupby('timestamp2')[['col1']].sum()

, я получу следующий результат:

timestamp2  col1   
2019-12-10  778    
2020-01-09  3100    
2020-02-08  2470   

Почему pandas возвращает эти даты, если моя минимальная дата - 1 января 2020 года, а максимальная временная метка - 1 марта 2020 года?

1 Ответ

1 голос
/ 16 марта 2020

origin является источником POSIX: 1970-01-01 . При использовании .floor('30D') допустимые значения: 1970-01-01, 1970-01-31, ... и все остальные 30-дневные коэффициенты. Ваши даты близки к 608-610-м кратным.

pd.to_datetime('1970-01-01') + pd.DateOffset(days=30*608)
#Timestamp('2019-12-10 00:00:00')

pd.to_datetime('1970-01-01') + pd.DateOffset(days=30*609)
#Timestamp('2020-01-09 00:00:00')

Если вы хотите получить 30D периодов от вашего первого наблюдения, то resample - это способ агрегирования:

df.resample('30D', on='timestamp')['timestamp'].agg(['min', 'max'])

                  min                 max
timestamp                                
2020-01-01 2020-01-01 2020-01-30 12:00:00    # starts from 1st date
2020-01-31 2020-01-31 2020-02-29 12:00:00
2020-03-01 2020-03-01 2020-03-01 12:00:00
...