如何从csv文件中读取日期/时间字段,并在python中相应地绘制图形

Anv*_*rma 4 python csv matplotlib

我使用python csv模块从CSV文件导入记录.

日期/时间字段要求日期为特定格式,但不同的电子表格程序默认为不同类型的格式,我不希望用户必须更改其格式.我想找到一种方法来检测格式字符串是,或只允许几种指定的格式.

如何从csv文件中读取日期/时间字段并相应地绘制图形.

unu*_*tbu 8

dateutil可以解析各种格式的日期字符串,而无需事先指定日期字符串的格式:

In [8]: import dateutil.parser as parser

In [9]: parser.parse('Jan 1')
Out[9]: datetime.datetime(2011, 1, 1, 0, 0)

In [10]: parser.parse('1 Jan')
Out[10]: datetime.datetime(2011, 1, 1, 0, 0)

In [11]: parser.parse('1-Jan')
Out[11]: datetime.datetime(2011, 1, 1, 0, 0)

In [12]: parser.parse('Jan-1')
Out[12]: datetime.datetime(2011, 1, 1, 0, 0)

In [13]: parser.parse('Jan 2,1999')
Out[13]: datetime.datetime(1999, 1, 2, 0, 0)

In [14]: parser.parse('2 Jan  1999')
Out[14]: datetime.datetime(1999, 1, 2, 0, 0)

In [15]: parser.parse('1999-1-2')
Out[15]: datetime.datetime(1999, 1, 2, 0, 0)

In [16]: parser.parse('1999/1/2')
Out[16]: datetime.datetime(1999, 1, 2, 0, 0)

In [17]: parser.parse('2/1/1999')
Out[17]: datetime.datetime(1999, 2, 1, 0, 0)

In [18]: parser.parse("10-09-2003", dayfirst=True)
Out[18]: datetime.datetime(2003, 9, 10, 0, 0)

In [19]: parser.parse("10-09-03", yearfirst=True)
Out[19]: datetime.datetime(2010, 9, 3, 0, 0)
Run Code Online (Sandbox Code Playgroud)

将日期和值收集到列表中后,可以使用它们进行绘制plt.plot.例如:

import matplotlib.pyplot as plt
import datetime as dt
import numpy as np

n=20
now=dt.datetime.now()
dates=[now+dt.timedelta(days=i) for i in range(n)]
values=[np.sin(np.pi*i/n) for i in range(n)]
plt.plot(dates,values)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

根据Joe Joeton的评论,也可以使用与上面相似的图表matplotlib.dates.datestr2num而不是dateutil.parser显式使用:

import matplotlib.pyplot as plt
import matplotlib.dates as md
import datetime as dt
import numpy as np

n=20
dates=['2011-Feb-{i}'.format(i=i) for i in range(1,n)]
dates=md.datestr2num(dates)
values=[np.sin(np.pi*i/n) for i in range(1,n)]
plt.plot_date(dates,values,linestyle='solid',marker='None')
plt.show()
Run Code Online (Sandbox Code Playgroud)

  • 对于它的价值,matplotlib有一个(有些未记录的)便利功能,使用dateutil来做到这一点.`matplotlib.dates.datestr2num`将采用表示日期时间的字符串序列,推断格式并返回日期(在matplotlib的内部浮点表示中,而不是日期时间对象).当然,因为返回的数组是一个浮点数组,你需要使用`plot_date`让matplotlib正确地推断浮点代表日期.... (2认同)