我有一个只有夏季月份的日期时间数据帧。如何绘制以使其连续而不是按年份分开?

I have a datetime dataframe that only has the summer months. How do I plot so that it is continuous instead of being separated by year?

提问人:rwp_utk 提问时间:10/26/2023 更新时间:10/26/2023 访问量:51

问:

正如我在标题中提到的,我有一个日期时间数据框,我已经编辑为仅包括夏季月份。当我去绘制它时,这就是它的样子。我该如何修复它,以便年份之间没有差距?当前数据图

除了从日期时间转换它之外,我不确定从哪里开始,但我真的不想这样做。

Python Pandas 数据帧 matplotlib 日期时间

评论

1赞 mozway 10/26/2023
你会如何用笔和纸画它?
0赞 Corralien 10/26/2023
将您的日期时间转换为字符串?
0赞 OCa 10/26/2023
欢迎来到 SO。1)感觉像重复。我以前见过这个。您是否搜索过类似的问题?2) 如果我弄错了,请提供一点输入数据样本(参见最小可重现示例如何寻求指导)
0赞 OCa 10/26/2023
请更清楚地说明你所说的“所以岁月之间没有差距”的意思。a) 您希望时间轴跳过间隙吗?stackoverflow.com/q/65562664/12846804或者,b) 您是否希望绘图不绘制连接间隙的线?stackoverflow.com/q/41890749/12846804
0赞 Trenton McKinney 10/26/2023
1. 2. 3. 4. 5. 代码和绘图df['date_col'] = pd.to_datetime(df['date_col'])df['Year'] = df['date_col'].dt.yeardf['DoY'] = df['date_col'].dt.day_of_yearimport seaborn as snssns.lineplot(data=df, x='DoY', y='value_col', hue='Year')

答:

1赞 Corralien 10/26/2023 #1

没有任何其他信息很难帮助你。

假设您有以下数据帧:

>>> df
      Datetime   temp
0   2021-06-21  76.66
1   2021-06-22  81.79
2   2021-06-23  68.95
3   2021-06-24  84.59
4   2021-06-25  65.41
..         ...    ...
265 2023-09-14  82.87
266 2023-09-15  70.50
267 2023-09-16  76.81
268 2023-09-17  75.20
269 2023-09-18  73.11

[270 rows x 2 columns]

>>> df.groupby(df['Datetime'].dt.year)['Datetime'].agg(['min', 'max'])
                min        max
Datetime                      
2021     2021-06-21 2021-09-18
2022     2022-06-21 2022-09-18
2023     2023-06-21 2023-09-18

如果你想要如下图所示的东西,你可以这样做:

xticks = df.loc[df['Datetime'].dt.day.eq(1), 'Datetime'].dt.strftime('%Y-%m')
vlines = df.groupby(df['Datetime'].dt.year)['Datetime'].idxmax()[:-1]
ax = df.plot(y='temp', rot=45)
ax.set_xticks(xticks.index, xticks)
ax.vlines(vlines, ymin=df['temp'].min(), ymax=df['temp'].max(), color='red', ls='dashed')
plt.tight_layout()
plt.show()

输出:

enter image description here

最小工作示例

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

period0 = pd.Series(pd.date_range('2021-06-21', periods=90, freq='D'))
period1 = pd.Series(pd.date_range('2022-06-21', periods=90, freq='D'))
period2 = pd.Series(pd.date_range('2023-06-21', periods=90, freq='D'))
df = pd.concat([period0, period1, period2], axis=0, ignore_index=True).to_frame('Datetime')
df['temp'] = np.round(65 + np.random.random(90*3) * 20, 2)