从文件中读取日期以用于绘图

时间:2013-03-15 18:50:28

标签: python date numpy matplotlib

我正在尝试从数据记录器中读取日期戳,并在图中使用这些日期。我一直在使用matplotlib日期date2num,datestr2num和datetime,但我一直在弄格式错误,并且无法找到正确的语法和关键字来执行此操作(以及它们的含义)。我一直在阅读matplotlib的帮助并没有多少运气。如果您有任何帮助或更好的方式来阅读这些信息,我会很乐意反馈。

import numpy as n
import matplotlib.pyplot as p
import matplotlib.dates as d
import datetime as dt


fileobj=open("filename",'r')
data=fileobj.readlines()
fileobj.close()
time=n.empty(len(data))
for i in range(len(data)):
  strings=data[i].split(',')
  if i >5:
    some_time_dt = dt.datetime.strptime(str(strings[0]), '%Y-%m-%d %H:%M:%S')
    time = d.date2num(some_time_dt)

示例数据:

"2013-02-28 16:53:30",1588,11.85,24.35,22.93,24.1,25.05,22.06,22.2,30.94,21.99,22.7,21.91,22‌​.02,21.79 ,21.72 
"2013-02-28 16:53:31",1589,11.85,24.35,23,24.12,25.05,22.09,22.25,31.19,21.97,22.71,21.91,22‌​.02,21.78 ,21.72
"2013-02-28 16:53:32",1590,11.85,24.35,22.98,24.12,25.05,22.12,22.3,31.35,21.98,22.68,21.9,2‌​2.01,21.7 4,21.69 
"2013-02-28 16:53:33",1591,11.85,24.35,22.95,24.14,25.06,22.15,22.33,31.49,21.96,22.67,21.87‌​,22,21.73 ,21.66

2013年3月20日 我能够得到这个情节,但我需要知道如何摆脱打印的UTC标签,因为时间不是UTC,而是PST。我宁愿根本不显示时区。

4 个答案:

答案 0 :(得分:2)

一个简单的解决方案是解析文件两次,一次是日期,一次是数据:

import numpy as np
import datetime as dt

D = np.loadtxt("filename",delimiter=",",usecols=[0],dtype="str")
Z = np.loadtxt("filename",delimiter=",",usecols=range(1,10))

DATES = [dt.datetime.strptime(d,'"%Y-%m-%d %H:%M:%S"') for d in D]

您还可以使用converters参数将lambda函数传递给loadtxt(),以便它为您执行字符串到日期时间对象的转换。它不会为你节省任何代码行,我只是注意到它的各种变化:

datey = lambda x: dt.datetime.strptime(x,'"%Y-%m-%d %H:%M:%S"')

D = np.loadtxt("filename",delimiter=",",usecols=[0],
               dtype=dt.datetime,converters={0:datey})
Z = np.loadtxt("filename",delimiter=",",usecols=range(1,10))

答案 1 :(得分:0)

听起来你在解析日期时遇到了错误。您正在使用的日期格式字符串可能存在问题。

这里有一个表格,其中包含可用于日期时间解析的所有选项: http://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

答案 2 :(得分:0)

我通常使用pandas做这种事情(参见上面的评论),但这是使用Python内置CSV模块的粗略解决方案。

import csv
import datetime
data = []
for row in csv.reader(open('file.txt')):
    row[0] = datetime.datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S') # Parse date.
    row[1:] = map(float, row[1:]) # Convert data from strings to floats.
    data.append(row)

有更好的方法,但这是一种简单的方法。

在上面的数据上运行,我得到了

[[datetime.datetime(2013, 2, 28, 16, 53, 30), 1588.0, 11.85...], ...]

答案 3 :(得分:0)

您需要从时间字符串中删除"

如果每行只有一次,我会改变for循环,如下所示:

import time as time_module  # there's is a var named time
lineNumber = 0
for line in data:
    lineNumber += 1
    if line <= 5:
        continue  # skip the first 5 lines

    line = line.split(',')
    timeString = line[0].strip('"')
    print timeString
    print time_module.strptime(timeString, '%Y-%m-%d %H:%M:%S')
    time = d.date2num(time_module.strptime(timeString, '%Y-%m-%d %H:%M:%S'))