Извлечение дня месяца из столбца datetime для построения сезонного графика с Seaborn - PullRequest
0 голосов
/ 13 января 2020

Пример Dataframe Я имею дело со следующим.

df_sub = pd.DataFrame([[2020-01-01, 2019-01-02, 2018-01-15, 2017-01-18], [2019, 2018, 2017, 2016], [15, 9, 39, 20]], columns=['GAME_DATE', 'SEASON', 'PTS')

  • В каждом СЕЗОНЕ есть около 20-30 точек данных для GAME_DATE и POINTS. Это будет варьироваться в зависимости от того, что выбрано на другом фрейме данных, DF
  • GAME_DATE - это столбец даты и времени

Я хочу создать один сюжет с game_date по оси x, точки на y - ось и одна линия, нанесенная для каждого сезона.

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

ax = sns.lineplot(x = 'GAME_DATE', y = 'PTS', hue = 'SEASON', markers = True, dashes = False, data = df_sub)

Выяснилось, что мне нужно извлечь месяц и день от GAME_DATE для X-AXIS, так как СЕЗОН уже позаботился о компоненте год / сезонность

df_sub['SEASONAL'] = df_sub['GAME_DATE'].dt.strftime('%m-%d')

, что делает работу с точки зрения извлечения месяца, однако, при построении графика со следующим - график создан такое абсолютный беспорядок

ax = sns.lineplot(x = 'SEASONAL', y = 'PTS', hue = 'SEASON', markers = True, dashes = False, data = df_sub)

Думаешь, мне нужно преобразовать df_sub ['SEASONAL'] в столбец datetime из его текущего типа как ненулевой объект? Тем не менее, попытка выполнить следующее вставляет год назад в каждую запись сезонного столбца (1900 год ... ухххх)

df_sub['SEASONAL'] = pd.to_datetime(df_sub['SEASONAL'], format = "%m-%d")

Цените любую помощь

1 Ответ

0 голосов
/ 13 января 2020

Строка datetime не работает при построении графика. Вы можете преобразовать дату и время строки в время эпохи в миллисекундах.

import pandas as pd
import seaborn as sns; sns.set()
import matplotlib.pylab as plt

# make epoch datetime
list_date = ['2020-01-01', '2019-01-02', '2018-01-15', '2017-01-18']
dates = [pd.to_datetime(d) for d in list_date]
dates_epoch = [(t- pd.Timestamp("1970-01-01")) // pd.Timedelta('1ms') for t in dates]

# create dataframe
df_sub = pd.DataFrame([dates_epoch, 
                       [2019, 2018, 2017, 2016], 
                       [15, 9, 39, 20]
                      ])
df_sub = df_sub.T
df_sub.columns=['GAME_DATE', 'SEASON', 'PTS']

# print(df_sub)
#        GAME_DATE  SEASON  PTS
# 0  1577836800000    2019   15
# 1  1546387200000    2018    9
# 2  1515974400000    2017   39
# 3  1484697600000    2016   20

sns.lmplot(x='GAME_DATE', y='PTS', hue= 'SEASON', data=df_sub,lowess=True)

# get current axis
ax = plt.gca()
# get current xtick labels
xticks = ax.get_xticks()
# convert all xtick labels to selected format from ms timestamp
ax.set_xticklabels([pd.to_datetime(tm, unit='ms').strftime('%Y-%m-%d') for tm in xticks], rotation=50)

plt.show()

enter image description here

Я не уверен, что это желаемый результат, но надеюсь, что это поможет .


Редактировать Чтобы ответить на комментарии ...

Для вашего случая

pd.to_datetime(df_sub['SEASONAL'].iloc[0], unit='ms').strftime('%m-%d')

будет Работа.

pd.to_datetime() делает отметку времени с pandas. Я думаю, что этот способ полезен для простого управления данными времени.

# put some timedata, mostly string but int with unit is ok
pd.to_datetime(1577836800000, unit='ms')
# Timestamp('2020-01-01 00:00:00')
pd.to_datetime('2020-01-01')
# Timestamp('2020-01-01 00:00:00')

и с помощью strftime(format) конвертируйте метку времени из строки в формат.

pd.to_datetime('2020-01-01').strftime('%m-%d')
# '01-01'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...