我对Python编程很陌生,并且已经面临一个让我疯狂的问题。我一直在寻找问题 - 即使在堆栈溢出时也是如此。但是,我没有得到任何解决方案来解决我的问题,这让我注册了这个网站。
然而,这是我的问题:
我有几个txt文件,包含3列。第一个可以忽略,第二个包含日期和时间的混合,用字母“T”分隔,第三列包含值(压力,温度,如此)。
现在,我想要做的是绘制x轴上的第二列(时间和日期)和y轴上的值。
我已经尝试了很多代码 - 这里也有一些代码在堆栈溢出时进行了描述 - 但是没有一个是我正在搜索的代码并且带来了正确的结果。
更详细,这是我的txt文件的样子:
#MagPy ASCII
234536326.456,2014-06-17T14:23:00.000000,459.7463393940044
674346235.235,2014-06-17T14:28:00.000000,462.8783040474751
等等。
忘记第一栏。只有第二个和第三个是相关的。所以在这里,我想,我必须跳过第一行(和第一列),对吧?
然而 - 这是我无法解决的部分 - 在第二列内部使用此“T”,这将成为字符串格式。 我得到的许多错误之一是:无法将字符串转换为浮动
好吧,我搜索了堆栈溢出并遇到了以下代码:
x, y = np.loadtxt('example.txt', dtype=int, delimiter=',',
unpack=True, usecols=(1,2))
plt.plot(x, y)
plt.title('example 1')
plt.xlabel('D')
plt.ylabel('Frequency')
plt.show()
我将“usecols”编辑为1和2,但是使用此代码,我得到错误:list index超出范围
所以,无论我做什么都没关系,我随时都会收到错误。我唯一想要的是一个绘图(使用matplotlib),它包含x轴上的时间和日期以及y轴上的值(例如,从上面459.7463393940044)。 并谈论我需要的东西:最后,我必须在一个图中放置几个用很多txt文件数据生成的图表(大约4-6个)。
拜托,有人可以帮我吗?我非常感谢你的帮助!
答案 0 :(得分:0)
这是numpy日期时间格式。您需要为datetime字段添加显式转换器。 documentation包含其他格式详细信息。 This问题显示了如何填写转换器参数。
date, closep, highp, lowp, openp, volume =
np.loadtxt(f, delimiter=',', unpack=True,
converters={0:mdates.strpdate2num('%d-%b-%y')})
这足以引导您获得完整的解决方案吗?
答案 1 :(得分:0)
首先,感谢您的回复!不幸的是,这根本不起作用。我用你的转换器尝试了它并将它与我的代码结合起来,但它并没有很好地解决。我试过这段代码:
# Converter function
datefunc = lambda x: mdates.date2num(datetime.strptime(x, '%d %m %Y %H %M %S'))
# Read data from 'file.dat'
dates, levels = np.genfromtxt('BMP085_10085001_0001_201508.txt', # Data to be read
delimiter=19, # First column is 19 characters wide
converters={1: datefunc}, # Formatting of column 0
dtype=float, # All values are floats
unpack=True) # Unpack to several variables
fig = plt.figure()
ax = fig.add_subplot(111)
# Configure x-ticks
ax.set_xticks(dates) # Tickmark + label at every plotted point
ax.xaxis.set_major_formatter(mdates.DateFormatter('%d/%m/%Y %H:%M'))
ax.plot_date(dates, levels, ls='-', marker='o')
ax.set_title('title')
ax.set_ylabel('Waterlevel (m)')
ax.grid(True)
# Format the x-axis for dates (label formatting, rotation)
fig.autofmt_xdate(rotation=45)
fig.tight_layout()
fig.show()
我再次获得列表索引超出范围错误。说真的,我不知道任何可能的解决方案,最终使它看起来像那样:{Plot date and time (x axis) versus a value (y axis) using data from file} - 请参见页面底部的图表。
答案 2 :(得分:0)
我做了以下成功。首先,您可以将ISO8601日期作为字符串读取(因此基本读取一行并在逗号上拆分将起作用)。要将日期字符串转换为日期时间对象,您可以使用
import dateutil
# code to read in date_strings and my_values as lists goes here ...
# Here's the magic to parse the ISO8601 strings and make them into datetime objects
my_dates = dateutil.parser.parse(date_strings)
# Now plot the results
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot_date(x=my_dates, y=my_values, marker='o', linestyle='')
ax.set_xlabel('Time')