0

我正在尝试从数据记录器中读取日期戳并在图中使用这些日期。我一直在使用 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

4 回答 4

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))
于 2013-03-15T21:43:46.857 回答
0

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

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

于 2013-03-15T18:54:57.333 回答
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...], ...]
于 2013-03-15T19:20:17.697 回答
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'))
于 2013-03-15T19:25:59.303 回答