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.