Как подсчитать количество повторяющихся дат, используя pandas и datetime, в импортированном столбце excel?

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

Пример данных ниже — это лишь несколько столбцов — их 16, но мне нужно использовать только date_report.

Данные из образца Excel:

'''

   sex---------country-------date_report

    M           Canada       03-01-2020

    F           Canada       03-01-2020

    M           Canada       03-02-2020

    F           Canada       03-02-2020

    M           Canada       03-02-2020

    M           Canada       03-03-2020

    F           Canada       03-03-2020

    M           Canada       03-04-2020

    F           Canada       03-04-2020

    M           Canada       03-04-2020

'''

Мне нужно рассчитать количество случаев с 1 марта по 10 июля 2020 года из столбца date_report. В строках есть повторяющиеся даты, их необходимо суммировать, чтобы получить одно общее значение для каждой даты (2 для 01.03.2020, 4 для 02.03.2020 и т. д.)

После прочтения файла excel и импорта pandas и datetime:

'''

    day_first=datetime.date(2020, 3, 1)
    day_last=datetime.date(2020, 7, 10)
    delta = (day_last - day_first)
    print(delta.days)

    for i in range(delta.days + 1):
        all_dates = day_first + datetime.timedelta(+i)
        print(all_dates)    # This gives me the range of dates I am looking for. 

    date_count=df.groupby('date_report').date_report.count()

    print(date_count)

    date_count.plot(kind='line') # This plot goes from the first date in January until the end of the list, I just want March 1-July 10. 

'''

Как я уже сказал, цель состоит в том, чтобы построить линейный график с датами с 1 марта по 10 июля по оси x, показывающий общее количество случаев в день по оси y. Любая помощь будет принята с благодарностью!


person Community    schedule 15.07.2020    source источник


Ответы (1)


Вам просто нужно сократить исходный набор данных до интересующих вас дат, прежде чем выполнять группировку:

import matplotlib.pyplot as plt

# select data between dates of interest
sub_df = df.loc[df['date_report'].between(first_day, last_day), :]

date_count = sub_df.groupby('date_report').date_report.count()

date_count.plot(kind='line')
plt.show()

Если вам нужно изменить способ хранения дат в фрейме данных для проблем совместимости между различными типами (datetime.datetime, datetime64[ns]), вы можете преобразовать их в универсальные объекты pd.Timestamp с помощью

df['date_report'] = [pd.Timestamp(d) for d in df['date_report']]

или, в этом случае, ограничивающие даты и время:

first_day = pd.Timestamp(first_day)
last_day = ...
person Dagorodir    schedule 15.07.2020
comment
Я получаю - TypeError: Недопустимое сравнение между dtype=datetime64[ns] и датой. Какие-либо предложения? Спасибо! - person ; 16.07.2020
comment
Где вылетает ошибка? В любом случае, вполне вероятно, что значения date_report хранятся как тип datetime64[ns] и поэтому несопоставимы с объектами datetime.datetime first_day и last_day. См. мой отредактированный ответ - объекты pd.Timestamp отлично подходят для работы с датами, поскольку они совместимы с большинством других типов объектов даты и времени и имеют множество других замечательных методов от панд - см. документы здесь. Пожалуйста, проголосуйте за мой ответ, если вы нашли его полезным! :) - person Dagorodir; 16.07.2020
comment
Ошибка возникает в sub_df = df.loc[df['date_report'].between(first_day, last_day), :] . Когда я помещаю строку метки времени выше, она все равно не исправляет ошибку TypeError. - person ; 16.07.2020
comment
Что произойдет, если вы также преобразуете first_day и last_day в pd.Timestamp? (first_day = pd.Timestamp(first_day)) - person Dagorodir; 16.07.2020
comment
@akearney17 Нет проблем! Пожалуйста, примите мой ответ, нажав на галочку :) - person Dagorodir; 16.07.2020