Python 从datetime列中提取月日,用Seaborn绘制季节性折线图
我正在处理的数据帧示例如下Python 从datetime列中提取月日,用Seaborn绘制季节性折线图,python,pandas,seaborn,Python,Pandas,Seaborn,我正在处理的数据帧示例如下 df_sub=pd.数据帧([[2020-01-012019-01-022018-01-152017-01-18],[2019-2018-2017-2016],[15,9,39,20]),列=['GAME_DATE','SEASON','PTS') 每个赛季的比赛日期和积分大约有20-30个数据点。这取决于从其他数据框(DF)中选择的数据 游戏日期是一个日期时间列 我想创建一个单独的绘图,x轴上有游戏日期,y轴上有点数,每个赛季绘制一条线 尝试了以下方法,但没有达
df_sub=pd.数据帧([[2020-01-012019-01-022018-01-152017-01-18],[2019-2018-2017-2016],[15,9,39,20]),列=['GAME_DATE','SEASON','PTS')
- 每个赛季的比赛日期和积分大约有20-30个数据点。这取决于从其他数据框(DF)中选择的数据
- 游戏日期是一个日期时间列
ax=sns.lineplot(x='GAME\u DATE',y='PTS',hue='seasure',markers=True,破折号=False,data=df\u sub)
我想我需要从X轴的GAME_日期中提取月和日,因为季节已经考虑了年/季节性成分
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年..uhh)
非常感谢您的帮助。打印时,字符串日期时间不起作用。您可以将字符串日期时间转换为纪元时间(毫秒)
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()
我不确定这是否是你想要的结果,但希望这能有所帮助
编辑以回答评论 对于你的情况
pd.to_datetime(df_sub['seasury'].iloc[0],unit='ms').strftime('%m-%d')
会有用的
pd.to\u datetime()
使用熊猫制作时间戳。我认为这种方法对于轻松管理时间数据非常有用
# 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'
感谢您的反馈,尽管这没有达到我想要的结果。我认为我的问题在于df_子数据帧中的GAME_DATE series列是一个字符串,就像您所说的那样,这会导致绘图问题。
df_sub['SEASONAL']=df['GAME_DATE'].dt.strftime(“%m-%d”)
我已经在回复帖子中添加了。请重试。再次感谢,我尝试了以下df_sub['seasury']=pd.to_datetime(df['GAME_DATE'])。strftime(“%m-%d”)
收到以下错误--序列对象没有属性strftime。然后尝试df_sub['seasury']=pd.to_datetime(player['GAME_DATE'].iloc(0),单位='ms')。strftime(“%m-%d”)
收到以下错误--参数“values”的类型不正确(应为numpy.ndarray,get _iLocIndexer)iloc[0],而不是(0)对于我的疏忽表示歉意。已将以下pd.应用于_datetime(df_sub['seasurrential'].iloc[0],unit='ms').strftime(“%m-%d”)
格式看起来不错,但是df_sub中季节列中的第一行值随后会在后续行中重复。尽管df_sub['seasury']=df_sub['GAME_DATE'].dt.strftime(“%m-%d”),我没有使用该格式的问题。
但是回到应用df_sub时将1900年添加到每个日期的问题['SEASONAL']=pd.to_datetime(df_sub['SEASONAL'],格式=“%m-%d”)
pd.to_datetime('2020-01-01').strftime('%m-%d')
# '01-01'