Панды DataFrame и DateTimeIndex - PullRequest
       0

Панды DataFrame и DateTimeIndex

0 голосов
/ 25 сентября 2018

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

import pandas as pd

df = pd.DataFrame({'time': ["2001-01-01 10:20:30,000", 
                            "2001-01-01 10:20:31,000",
                            "2001-01-02 5:00:00,000"],
                    'val': [1, 2, 3]})

t = pd.DatetimeIndex(df.time)
df = df.groupby([t.day, t.hour, t.minute]).count()

Результирующий фрейм данных:

                   time val
    time time time      
       1   10   20    2   2
       2    5    0    1   1

Ожидаемый вывод (или что-то подобное):

           time   count             
     1  1-10-20       2
     2    2-5-0       1

Сюжет, который я хочу: X - ось для минут, Y - ось для count, тики по дням + часам (грубее, чем минуты).

Вопросы:

1) Почему индекс состоит из 3 time столбцов и как получить индекс только с одним столбцом с такими элементами, как 1-10-20 и 2-5-0?

2) Как лучше всего иметь только один столбец с результатами count() вместо двух столбцов time и val?

2) Как можно построить эти данные (сгруппированы по дням / часам / минутам) с галочками по дням и часам?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Чтобы ответить на ваш первый вопрос, это потому, что вы группируете по трем отдельным сериям.Если вы действительно хотите, чтобы они были объединены, сгруппируйте по strftime:

df.time = pd.to_datetime(df.time)

df.groupby([df.time.dt.strftime('%d-%H-%M')]).val.count()

time
01-10-20    2
02-05-00    1
Name: val, dtype: int64

Вышеприведенное также отвечает на ваш второй вопрос.Вместо подсчета DataFrame, подсчитайте одну серию, вашу серию val.


Наконец, для построения графика вы можете использовать встроенную функциональность plot pandas.Я создаю более сложный пример для демонстрации желаемых тиков:

r = pd.date_range(start='2001-01-01', freq='5T', periods=100)
df = pd.DataFrame({'time':r, 'val': np.random.randint(1, 10, 100)})

out = df.groupby([df.time.dt.strftime('%d-%H-%M')]).val.count().reset_index()

ax = out.assign(label=out.time.str[:5]).plot(x='label', y='val', kind='bar')

seen_ticks = set()

for idx, label in enumerate(ax.xaxis.get_ticklabels()):
    if label.get_text() in seen_ticks:
        label.set_visible(False)
    else:
        seen_ticks.add(label.get_text())
plt.tight_layout()
plt.show()

Это покажет только уникальные x-тики для минуты / часа

enter image description here

0 голосов
/ 25 сентября 2018

1) Используйте pandas.DataFrame.from_dict(data) для создания кадра данных из словаря.(см. https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.from_dict.html)

2). Этот вопрос не совсем понятен, но я думаю, что вы хотите получить

df['time'] = pd.to_datetime(df['time'])
df.set_index('time', inplace=True)

, а затем применить count() агрегацию.

3) Этот вопрос мне не понятен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...