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

0 投票
3 回答
4299 浏览
提问于 2025-04-17 19:15

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

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))

撰写回答