从文件中读取日期以用于图表
我正在尝试从数据记录仪中读取日期戳,并在图表中使用这些日期。我一直在研究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)。我更希望完全不显示时区。
3 个回答
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...], ...]
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'))
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))