使用日期,时间和值数据绘制txt文件

时间:2016-01-25 22:38:36

标签: python date time load

我对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个)。

拜托,有人可以帮我吗?我非常感谢你的帮助!

3 个答案:

答案 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')