Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从datetime列中提取月日,用Seaborn绘制季节性折线图_Python_Pandas_Seaborn - Fatal编程技术网

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)中选择的数据
  • 游戏日期是一个日期时间列
我想创建一个单独的绘图,x轴上有游戏日期,y轴上有点数,每个赛季绘制一条线

尝试了以下方法,但没有达到我想要的效果,因为它按顺序绘制每个季节的数据,并在有休息时留出间隔。我希望每个季节绘制在不同的线上,同时使用一年的一致x轴,而不是每年延伸

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'