Python 日期时间在美国和英国日期格式之间切换
Python datetime switching between US and UK date formats
我正在使用 matplotlib 绘制从 CSV 文件导入的一些数据。这些文件具有以下格式:
Date,Time,A,B
25/07/2016,13:04:31,5,25550
25/07/2016,13:05:01,0,25568
....
01/08/2016,19:06:43,0,68425
日期的格式与英国的格式相同,即 %d/%m/%Y
。最终结果是有两个图:一个是 A
如何随时间变化,另一个是 B
如何随时间变化。我像这样从 CSV 导入数据:
import matplotlib
matplotlib.use('Agg')
from matplotlib.mlab import csv2rec
import matplotlib.pyplot as plt
from datetime import datetime
import sys
...
def analyze_log(file, y):
data = csv2rec(open(file, 'rb'))
fig = plt.figure()
date_vec = [datetime.strptime(str(x), '%Y-%m-%d').date() for x in data['date']]
print date_vec[0]
print date_vec[len(date_vec)-1]
time_vec = [datetime.strptime(str(x), '%Y-%m-%d %X').time() for x in data['time']]
print time_vec[0]
print time_vec[len(time_vec)-1]
datetime_vec = [datetime.combine(d, t) for d, t in zip(date_vec, time_vec)]
print datetime_vec[0]
print datetime_vec[len(datetime_vec)-1]
y_vec = data[y]
plt.plot(datetime_vec, y_vec)
...
# formatters, axis headers, etc.
...
return plt
8 月 1 日之前一切正常。然而,从那时起,matplotlib 试图将我的 01/08/2016 数据点绘制为 2016-01-08(1 月 8 日)!
我得到一个绘图错误,因为它试图从一月到七月绘制:
RuntimeError: RRuleLocator estimated to generate 4879 ticks from 2016-01-08 09:11:00+00:00 to 2016-07-29 16:22:34+00:00:
超过 Locator.MAXTICKS * 2 (2000)
我在这里做错了什么?上面代码中打印语句的结果是:
2016-07-25
2016-01-08 #!!!!
13:04:31
19:06:43
2016-07-25 13:04:31
2016-01-08 19:06:43 #!!!!
您正在使用 %d/%m/%Y
格式的字符串,但您将格式说明符指定为 %Y-%m-%d
。
Matplotlib 的 csv2rec 函数已经解析了您的日期,并尝试在解析日期时变得更加智能。该函数有两个影响解析的选项,dayfirst
应该在这里有所帮助:
dayfirst: default is False so that MM-DD-YY has precedence over DD-MM-YY.
yearfirst: default is False so that MM-DD-YY has precedence over YY-MM-DD.
See http://labix.org/python-dateutil#head-b95ce2094d189a89f80f5ae52a05b4ab7b41af47 for further information.
我正在使用 matplotlib 绘制从 CSV 文件导入的一些数据。这些文件具有以下格式:
Date,Time,A,B
25/07/2016,13:04:31,5,25550
25/07/2016,13:05:01,0,25568
....
01/08/2016,19:06:43,0,68425
日期的格式与英国的格式相同,即 %d/%m/%Y
。最终结果是有两个图:一个是 A
如何随时间变化,另一个是 B
如何随时间变化。我像这样从 CSV 导入数据:
import matplotlib
matplotlib.use('Agg')
from matplotlib.mlab import csv2rec
import matplotlib.pyplot as plt
from datetime import datetime
import sys
...
def analyze_log(file, y):
data = csv2rec(open(file, 'rb'))
fig = plt.figure()
date_vec = [datetime.strptime(str(x), '%Y-%m-%d').date() for x in data['date']]
print date_vec[0]
print date_vec[len(date_vec)-1]
time_vec = [datetime.strptime(str(x), '%Y-%m-%d %X').time() for x in data['time']]
print time_vec[0]
print time_vec[len(time_vec)-1]
datetime_vec = [datetime.combine(d, t) for d, t in zip(date_vec, time_vec)]
print datetime_vec[0]
print datetime_vec[len(datetime_vec)-1]
y_vec = data[y]
plt.plot(datetime_vec, y_vec)
...
# formatters, axis headers, etc.
...
return plt
8 月 1 日之前一切正常。然而,从那时起,matplotlib 试图将我的 01/08/2016 数据点绘制为 2016-01-08(1 月 8 日)!
我得到一个绘图错误,因为它试图从一月到七月绘制:
RuntimeError: RRuleLocator estimated to generate 4879 ticks from 2016-01-08 09:11:00+00:00 to 2016-07-29 16:22:34+00:00:
超过 Locator.MAXTICKS * 2 (2000)
我在这里做错了什么?上面代码中打印语句的结果是:
2016-07-25
2016-01-08 #!!!!
13:04:31
19:06:43
2016-07-25 13:04:31
2016-01-08 19:06:43 #!!!!
您正在使用 %d/%m/%Y
格式的字符串,但您将格式说明符指定为 %Y-%m-%d
。
Matplotlib 的 csv2rec 函数已经解析了您的日期,并尝试在解析日期时变得更加智能。该函数有两个影响解析的选项,dayfirst
应该在这里有所帮助:
dayfirst: default is False so that MM-DD-YY has precedence over DD-MM-YY.
yearfirst: default is False so that MM-DD-YY has precedence over YY-MM-DD.
See http://labix.org/python-dateutil#head-b95ce2094d189a89f80f5ae52a05b4ab7b41af47 for further information.