【问题标题】:Formatting X-Axis Time in Python在 Python 中格式化 X 轴时间
【发布时间】:2015-11-05 22:01:33
【问题描述】:

我正在绘制一个文本文件中的数据,该文件有两列由逗号分隔。第一列是格式为%H:%S 的时间。第二行是数字。

现在,我的编码显示 %Y%m%d %H:%M:%s 而不是 %H:%M。如您所见,有很多条目,它们相互重叠。如何让刻度每 1 或 2 次跳过一次以使时间更明显?

我该如何纠正这个问题?

文件内容:

09:30,33.89
09:34,34.17
09:39,34.41
09:44,34.20
09:49,34.40

脚本:

#!/usr/bin/python
from __future__ import division
import sys
import csv
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import datetime as dt
import numpy as np

homedir = '/home//'

ymd = sys.argv[1]
sym = sys.argv[2]

x,y = [],[]
csv_reader = csv.reader(open(homedir + 'finance/data/' + sym + '_' + ymd))
for line in csv_reader:
    x.append(dt.datetime.strptime(line[0], '%H:%M'))
    y.append(str(line[1]))

fig = plt.figure()
ax = fig.add_subplot(111)

#ax.grid(which='both')

ax.plot(x,y,'-',ms=3,linewidth=1)
#fig.autofmt_xdate(x,rotation=90,ha='center')
plt.xticks(x, x, rotation=90,ha='center')
plt.title('Daily Market Data for ' + sym + ' on ' + ymd)
plt.ylabel('Stock Price [$]')
plt.xlabel('Time of Day')
plt.grid(True)

fig.set_size_inches(9,5)

plt.savefig(homedir + 'finance/' + sym + '_' + ymd + '.png', dpi = 300, bbox_inches='tight')
#plt.show()

剧情:

【问题讨论】:

标签: python csv unix matplotlib


【解决方案1】:

datetime.strptime() 使用第二个参数将字符串时间解析为datetime 对象,以将原始字符串中的值映射到datetime 组件。这里有几个指南解释了strptime()strftime() 之间的区别。

无论如何,我想你可以只为你的xticks 使用原始字符串,并留下为你的情节单独构建x 列表的行,因为它似乎工作得很好。

尝试将您的 for 循环部分更改为:

x,y,xticks = [],[],[]
csv_reader = csv.reader(open(homedir + 'finance/data/' + sym + '_' + ymd))
for line in csv_reader:
    xticks.append(line[0])
    x.append(dt.datetime.strptime(line[0], '%H:%M'))
    y.append(str(line[1]))

然后,当然,摆脱您的其他 xticks 分配并将您的 plt.xticks 调用更改为:

plt.xticks(x, xticks, rotation=90,ha='center')

编辑:OP 已添加到问题中,我将提供一些简短的建议。

也许在你的 for 循环中做一些骇人听闻的事情,比如

for line in csv_reader:
    time = dt.datetime.strptime(line[0], '%H:%M')
    if time.minute % 5 == 0:
        xticks.append(line[0])
    else:
        xticks.append("")
    x.append(time)
    y.append(str(line[1]))

【讨论】:

  • 嗨杰森。感谢您的答复!我忘了提到我希望 x 轴是 %H:%M 次,而不是我在 xticks 数组中定义的。仍然得到 %Y%m%d %H:%M:%s 而不是 %H:%M...
  • 您是否删除了创建xticks 列表的行?请注意,在我的答案中的 for 循环中,它正在加载一个新的空 xticks 列表。现在对于您刚刚添加到问题中的另一个问题,我将进行编辑。
  • 噢!忘记删除之前定义的 xticks 数组。这非常适合将 %Y%m%d %H:%M:%s 降低到 %H:%M!
猜你喜欢
  • 1970-01-01
  • 2016-12-13
  • 2017-09-27
  • 2019-06-28
  • 2020-10-06
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多