Группировать неуникальный столбец даты и времени по значениям даты и суммы в python - PullRequest
1 голос
/ 13 марта 2020

У меня есть датафрейм df, как показано ниже:

         start_time                 end_time        count
0   2020-02-03 08:42:21.997 2020-02-03 09:34:18.737 3116
1   2020-02-03 09:34:18.837 2020-02-03 10:16:56.583 2557
2   2020-02-03 10:17:00.480 2020-02-03 13:18:51.540 10911
3   2020-02-03 13:18:51.640 2020-02-03 14:01:23.263 2551
4   2020-02-03 14:01:23.363 2020-02-03 14:43:56.977 255

Я бы хотел сгруппировать только по date столбца start_time и суммировать все соответствующие значения count в тот же день. , Я нашел соответствующий ответ из этого сообщения .

Используя этот метод:

data.groupby(data.date.dt.year)

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

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-46-7618d5285bb9> in <module>()
      1 
----> 2 df.groupby(df.date.dt.year)      # Adding ['start_time'] will return 'AttributeError: 'Series' object has no attribute 'date''.
      3 
      4 
      5 

/usr/local/lib/python3.6/dist-packages/pandas/core/generic.py in __getattr__(self, name)
   5177             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   5178                 return self[name]
-> 5179             return object.__getattribute__(self, name)
   5180 
   5181     def __setattr__(self, name, value):

AttributeError: 'DataFrame' object has no attribute 'date'

В чем проблема и как можно сгруппировать эти неуникальные значения даты и времени в столбце start_time по только дата и суммировать значения?


Редактировать:

Фактически я смог сделать это с помощью

import datetime 
df['date'] = df['start_time'].dt.date       # Group by 'date' of 'datetime' column
df.groupby('date').sum()                    # Sum

Но я хотел бы знать, смогу ли я сделать это напрямую, возможно, что-то более простое, как однострочный, как показано в ответе в вышеупомянутом посте.

1 Ответ

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

Super close, datetime.dt.date - это способ доступа только к зелью даты объекта datetime (https://www.geeksforgeeks.org/python-pandas-series-dt-date/). Попробуйте:

data.groupby(data["start_time"].dt.date)["count"].sum()

Вот некоторая справочная информация об индексировании, которое, я думаю, вам не хватает:

Когда мы пишем data["start_time"], мы получаем столбец start_time из вашего фрейма данных data. Эквивалентный способ получения этого столбца - использовать data.start_time. Когда вы пытаетесь получить доступ к data.date (что эквивалентно data["date"]), мы получаем ошибку атрибута, потому что ваш фрейм данных data не имеет столбца с именем date.

Если start_time столбец имеет тип datettime, тогда у него есть атрибут с именем dt, который имеет атрибут date, по которому мы хотим сгруппировать. Мы можем получить доступ к этому через data.start_time.dt.date или data["start_time"].dt.date.

Когда вы пишете data["date"] = data["start_time"], вы создаете в столбце данных новый столбец с именем date, который равен вашему столбцу start_time. Теперь вы можете получить к нему доступ через data.date (или data["date"]), поэтому ваше решение работает.

...