Python 使日期时间线在seaborn绘图x轴上看起来漂亮

Python 使日期时间线在seaborn绘图x轴上看起来漂亮,python,pandas,time-series,seaborn,Python,Pandas,Time Series,Seaborn,如何将datetime格式重新设置为第1周、第2周。。。要在海上航线图上绘图 输入 期望输出 通过将数据框的自然索引与本周匹配,我可以将其切碎。我想知道是否还有别的办法 import pandas as pd import seaborn as sns import matplotlib.pyplot as plt data = {'Date': ['2019-10-04', '2019-10-04', '2019-10-1

如何将datetime格式重新设置为第1周、第2周。。。要在海上航线图上绘图

输入

期望输出

通过将数据框的自然索引与本周匹配,我可以将其切碎。我想知道是否还有别的办法

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.

看起来您的数据已经每周间隔一次,因此您可以执行以下操作:

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


您可以使用周数创建一个新列,并将其用作x值。这将给你一年中的一周。如果希望以0开始周数,只需从值中减去第一个日期的周数(请参阅代码中注释掉的部分)

df.groupby('Date',as_index=False)['Ratio'].mean().plot()
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()