Сделайте так, чтобы линия даты и времени выглядела хорошо на графике морского побережья x ось - PullRequest
0 голосов
/ 25 февраля 2020

Как переформатировать дату-время в неделю 1, неделю 2 ... для построения графика на морском графике?

Вход

         Date     Ratio
0  2019-10-04  0.350365
1  2019-10-04  0.416058
2  2019-10-11  0.489051
3  2019-10-18  0.540146
4  2019-10-25  0.598540
5  2019-11-08  0.547445
6  2019-11-01  0.722628
7  2019-11-15  0.788321
8  2019-11-22  0.875912
9  2019-11-27  0.948905

Требуемый выход enter image description here

Я смог сделать это, сопоставив натуральный индекс кадра данных с неделей. Интересно, есть ли другой способ сделать это.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = {'Date': ['2019-10-04',
                 '2019-10-04',
                 '2019-10-11',
                 '2019-10-18',
                 '2019-10-25',
                 '2019-11-08',
                 '2019-11-01',
                 '2019-11-15',
                 '2019-11-22',
                 '2019-11-27'],
        'Ratio':       [0.350365,
                        0.416058,
                        0.489051,
                        0.540146,
                        0.598540,
                        0.547445,
                        0.722628,
                        0.788321,
                        0.875912,
                        0.948905]}

df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
graph = sns.lineplot(data=df,x='Date',y='Ratio')

plt.show()
# First plot looks bad.

week_mapping = dict(zip(df['Date'].unique(),range(len(df['Date'].unique()))))

df['Week'] = df['Date'].map(week_mapping)
graph = sns.lineplot(data=df,x='Week',y='Ratio')

plt.show()
# This plot looks better, but method seems cheesy.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Вы можете создать новый столбец с номером недели и использовать его в качестве значения x. Это даст вам неделю года. Если вы хотите начать номера недели с 0, просто вычтите номер недели первой даты из значения (см. Закомментированный раздел кода)

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from datetime import datetime as dt

data = {'Date': ['2019-10-04',
                 '2019-10-04',
                 '2019-10-11',
                 '2019-10-18',
                 '2019-10-25',
                 '2019-11-08',
                 '2019-11-01',
                 '2019-11-15',
                 '2019-11-22',
                 '2019-11-27'],
        'Ratio':       [0.350365,
                        0.416058,
                        0.489051,
                        0.540146,
                        0.598540,
                        0.547445,
                        0.722628,
                        0.788321,
                        0.875912,
                        0.948905]}

df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
# To get the week number of the year
df.loc[:, 'Week'] = df['Date'].dt.week
# Or you can use the line below for the exact output you had
#df.loc[:, 'Week'] = df['Date'].dt.week - (df.sort_values(by='Date').iloc[0,0].week)
graph = sns.lineplot(data=df,x='Week',y='Ratio')

plt.show()
0 голосов
/ 25 февраля 2020

Похоже, ваши данные уже разнесены еженедельно, поэтому вы можете просто сделать:

df.groupby('Date',as_index=False)['Ratio'].mean().plot()

Вывод:

enter image description here

...