我正在尝试从数据记录器中读取日期戳,并在图中使用这些日期。我一直在使用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,22.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。我宁愿根本不显示时区。
答案 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'))