【问题标题】:Plotting time series dataframe in python在python中绘制时间序列数据框
【发布时间】:2020-05-14 23:31:37
【问题描述】:

我很难从数据框 python 中绘制时间序列图。请在下面找到数据类型。

Time_split     datetime64[ns]   
Total_S4_Sig1        float64

time_split 列是 X 轴,是时间变量。总 s4 是 Y 变量,是一个浮点数。

0      15:21:00
1      15:22:00
2      15:23:00
3      15:24:00
4      15:25:00
5      19:29:00
6      19:30:00
7      19:31:00
8      19:32:00
9      19:33:00

请注意,时间序列永远不会以秒为单位,即它将始终为 00,并且数据是连续的,即它将是分钟连续数据。

数据不一定会在一小时内开始。它可以在任何时间开始,例如 15:35。我想创建一个图表,其中 X 轴主要标记将是完整的时间,例如 19:00、21:00、22:00,而次要标记应该是半小时,即 21:30、19:30。我不希望时间的秒部分被视为无用。

我想要它做的只是以 HH:MM 格式绘制小时和分钟,并在整个小时内绘制主要标记,在半小时内绘制次要标记。

keydata["Time_split"] = keydata["Time_split"].dt.time
keydata.plot(x='Time_split', y='Total_S4_Sig1')
plt.show()  

这段代码导致了这样的情节。

我不希望显示秒数,我希望在全小时显示标记,在半小时显示小标记。

keydata["Time_split"] = keydata["Time_split"].dt.time
time_form = mdates.DateFormatter("%H:%M")
ax = keydata.plot(x='Time_split', y='Total_S4_Sig1')
ax.xaxis.set_major_formatter(time_form)
plt.show()  

这段代码导致了这样的情节。

请注意秒数始终为 00

【问题讨论】:

  • 请发布您尝试过的内容,您当前在情节中看到的内容,并将您的问题范围限制在您实际想要更改的情节上。我们很难猜出您尝试了什么,更不用说您的期望了!
  • @MichaelDelgado。请查看编辑。我真的需要一些建议。
  • 所以问题只是情节本身的刻度格式?情节的其他一切都好吗?
  • 如果您使用 pd.to_timedelta 而不是 pd.to_datetime 是否可以解决问题?
  • 所以本质上问题是从这条线开始的。 df.Time_split = pd.to_datetime(df.Time_split, 格式 = "%H:%M:%S")。如果我要在那之后立即打印 Time_split。它将添加图中所示的无用日期。

标签: python pandas matplotlib


【解决方案1】:

尝试使用matplotlib date formatting

import matplotlib.dates as mdates
date_fmt = mdates.DateFormatter('%H:%M:%S')

# plot your data
ax = df.plot.line(x='time', y='values')

# add the date formatter as the x axis tick formatter
ax.xaxis.set_major_formatter(date_fmt)

【讨论】:

  • 非常感谢迈克尔。我们已经取得了一些进展。我将 datetime 对象转换为 datetime.dt.time。当我应用 DateFormatter 时。它刚刚绘制了 00:00:00 的图表。通过整个 X 轴。你知道原因吗?
  • 您的问题似乎是专门关于格式化日期时间轴的。您能否发布创建minimal reproducible example 的代码,以便我们帮助您调试?
  • 请看更新问题后喜欢:Final eidts Minimal code。希望这会更好
  • 一个可重复的例子应该从头开始。我们没有您的数据,因此很难知道您遇到了什么问题。为了获得更高质量的答案,我建议编辑您的帖子(而不是添加到帖子中),以创建一个明确、简洁的问题,专门针对您所看到的问题。就您目前的问题而言,很难提供帮助,因为我尝试重现您的问题并没有遇到这个问题。
  • 请看编辑。我希望这会有所帮助。@Michael Delgado
【解决方案2】:

以下应该解决您面临的问题:

import pandas as pd
from datetime import date, datetime, timedelta
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
#testing data
#keydata = pd.read_csv('test.txt',sep='\t',header=None,names=['Time_split','Total_S4_Sig1'])
x = pd.to_datetime(keydata['Time_split'])
y = keydata['Total_S4_Sig1']
# plot
fig, ax = plt.subplots(1, 1)
ax.plot(x, y,'ok')
# Format xtick labels as hour : minutes
xformatter = md.DateFormatter('%H:%M') 
## Set xtick labels to appear every 1 hours
ax.xaxis.set_major_locator(md.HourLocator(interval=1))
#set minor ticks every 1/2 hour
ax.xaxis.set_minor_locator(md.MinuteLocator(byminute=[0,30],interval=1))

plt.gcf().axes[0].xaxis.set_major_formatter(xformatter)
plt.show()

【讨论】:

  • 您好,感谢您的回答。我收到以下错误。TypeError:'formatter' 必须是 matplotlib.ticker.Formatter 的实例,而不是 matplotlib.dates.HourLocator。请指教。
  • 这是我在您的代码上方使用的代码行。这是我用来绘制的。 ax = keydata.plot(x='Time_split', y='Total_S4_Sig1')
  • 查看修改。
  • 再次感谢。 TypeError:float() 参数必须是字符串或数字,而不是“datetime.time”。我收到以下错误。我像这样将 datetime 类型转换为时间戳。 keydata["Time_split"] = keydata["Time_split"].dt.time。就在策划业务开始之前。
  • @chintanthakrar 上述解决方案能解决您的问题吗?
猜你喜欢
  • 2013-12-25
  • 1970-01-01
  • 2021-11-05
  • 2021-10-22
  • 2020-04-09
  • 2018-10-21
  • 1970-01-01
相关资源
最近更新 更多