【问题标题】:How to convert excel time without date to pandas dataframe and then plot it?如何将没有日期的excel时间转换为pandas数据框然后绘制它?
【发布时间】:2019-12-26 16:07:17
【问题描述】:

我想将数据集从 excel 文件导入到 pandas 数据框,然后绘制它。数据集包括日期列 - 应转换为 pd.datetime 和秒表列 - 应转换为格式:HH:MM:SS 或 HH:MM 或 H:MM 取决于数据(小时可能超过 24 小时和格式不应包括日期)。以下是数据中的一些行:

Date       Stopwatch1 Stopwatch2 Stopwatch3 Timesum
01.08.2019 00:10:05   19:05      0:45       25:01:00
02.08.2019 00:08:00   23:50      0:30       30:30:00
03.08.2019 00:05:00   00:10      0:40      124:00:00

然后我想在 y 轴上用时间格式 (HH:MM) 的标签和 x 轴上的日期列绘制秒表列。如果我可以指定例如如果 time

我尝试做:

df = pd.read_excel(path, dtype={'Stopwatch1':str, 'Stopwatch2':str, 'Stopwatch3':str})
tmd = pd.to_timedelta(df["Stopwatch1"])
tmd.plot()

绘图正在运行,但 y 轴上的标签是数字。我想将它们更改为时间格式(HH:MM)。

【问题讨论】:

  • 该情节适用于我在 pandas 0.24.1 上。你遇到了什么问题?
  • 我再试一次它正在工作,但不是以它应该的方式,因为在 y 轴上的标签应该是时间格式 (HH:MM) 我怎样才能将它们设置为这种格式?
  • 没有时间增量的转换器:pandas.pydata.org/pandas-docs/stable/reference/api/…。这也是一个 matplotlib 问题,你会想在那个标签中问这个。
  • 好的,但是有没有办法写这个转换器呢?它应该包括什么?您的链接无效。
  • 对不起,应该是:pandas.pydata.org/pandas-docs/stable/reference/api/…; timedelta 不在列表中

标签: python pandas matplotlib time


【解决方案1】:

不确定我是否正确理解了输出,但这会是您正在寻找的东西吗?

我将 Stopwatch1 添加为 datetime 以便 matplotlib dates 模块能够理解并帮助其正确格式化:

df['Stopwatch1'] = pd.to_datetime(df["Stopwatch1"])

from matplotlib import dates as mdates

fig, ax = plt.subplots()
ax.plot(df['Stopwatch1'])
ax.yaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))

如果您还希望日期作为 x 轴,您可以将其设置为索引,因此观察之间的距离将基于日期距离。

df['Date'] = pd.to_datetime(df["Date"])
df = df.set_index('Date')

fig, ax = plt.subplots()
ax.plot(df.index, df['Stopwatch1'])
ax.set_xticks(df.index)
ax.yaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d"))

【讨论】:

  • 这几乎是我正在寻找的,但我仍然看到三个问题。首先,如果 Stopwatch1 作为日期时间存储在数据框中,则其格式包含当前日期。有没有可能在没有日期的情况下存储它,只是时间?其次,如果我想绘制 Stopwatch2,就会出现问题。我如何证明例如 00:10 = 24:10 所以应该在 23:50 以上绘制?最后,像 Timesum 中的超过 24 小时的时间存在问题。如何以这种格式绘制和存储它?
  • 你是对的,它将被限制为一天而不是时间增量。你是什​​么意思 00:10 应该在 23:50 以上绘制?是不是因为它是在随后的日期(假设这可以通过 Timesum 验证?
  • 我的意思是我想指定:如果 Stopwatch2 中的时间小于 06:00 则 time = time + 24:00 (所以它应该被视为第二天,例如 24 :10 大于 23:50,但我想将 24:10 格式化为 00:10)。有没有办法做到这一点?通过Timesum,我的意思是本列中的时间可能大于24小时,所以我想以h:mm,hh:mm,hhh:mm格式绘制和存储它......取决于数字有多大(例如2 :50、30:50、100:50、2000:00)。有没有可能这样做?
  • 一切皆有可能@KrzysiekDev。让我把我的头脑围绕在逻辑上,再试一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2013-10-14
相关资源
最近更新 更多