【问题标题】:Modify datetime axis of a dataframe stacked histogram + Matplotlib DateFormatter issues with UTC datetime修改数据框堆叠直方图的日期时间轴 + Matplotlib DateFormatter 与 UTC 日期时间有关的问题
【发布时间】:2021-06-11 15:38:28
【问题描述】:

我有一个包含时间和情绪的数据框。时间变量为 YYYY-MM-DD HH:MM:SS。

我想用 5 分钟条绘制情绪的堆叠直方图。

下面的代码可以工作,但是 x 轴太忙了。我想在 x 轴上只显示 30 分钟的间隔,并且仍然有每 5 分钟的条形图。

你能帮我实现这个吗?

import matplotlib.pyplot as plt    
df['time'] = pd.to_datetime(df['time'])

df.groupby([df.time.dt.floor('5Min'),'Sentiment']).size().unstack().plot(kind='bar',stacked=True)

plt.show()

编辑#1

我认为以下代码方向正确,但 mdates.Dateformatter 似乎没有返回正确的日期。数据样本链接:https://pastebin.pl/view/52b65e7b

df = pd.read_csv("testfile.csv", nrows=999)
df['time'] = pd.to_datetime(df['time'], format='%Y-%m-%d %H:%M:%S%z')
df['time'] = pd.to_datetime(df['time'], utc=True)
df['time'] = df['time'].dt.tz_convert('US/Eastern')


df.groupby([df.time.dt.floor('5Min'),'Sentiment']).size().unstack().plot(kind='bar',stacked=True)


plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M:%S'))
plt.gca().xaxis.set_major_locator(mdates.MinuteLocator(interval=30))
plt.gcf().autofmt_xdate()
plt.show()

编辑#2

在我的数据框中,我有另一个名为“close”的列,我想在同一轴上显示为一条线。如何在此图上为 df['close'] 叠加一条线?

【问题讨论】:

  • 旁注:pd.to_datetime(df['time'], utc=True) 应该可以,你不需要之前的行。
  • 注意 - 感谢您的注意

标签: python dataframe datetime matplotlib


【解决方案1】:

如果您想在分组图中细化其 X 轴上的时间序列,最简单的方法是使用根据需要创建的标签对其进行更新。您的代码的更改是删除了时区信息,因为它使 X 轴上的标签更长。我们还使用 resample 函数每 5 分钟进行一次采样。如果数据不同,请更正。

import pandas as pd
import numpy as np

df = pd.read_csv('testfile.csv', sep=',', nrows=999)
df['time'] = pd.to_datetime(df['time'])
df.set_index('time', inplace=True)
df.index = df.index.tz_localize(None)

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

ax = df.groupby(['Sentiment']).resample('5min').size().unstack().T.plot(kind='bar', stacked=True, figsize=(14,9))

df_ts = df.groupby(['Sentiment']).resample('5min').size().unstack().T
labels = [ str(x) if (x.minute == 30) | (x.minute == 0) else '' for x in df_ts.index]

ax.set_xticklabels(labels, rotation=45)
plt.gcf().autofmt_xdate()
plt.show()

【讨论】:

  • 效果很好,感谢您的详细解释。