Python's datetime strptime() inconsistent between machines
Question: I'm stumped. The date-cleaning functions I wrote work in Python 2.7.5 on my
Mac but not in 2.7.6 on my Ubuntu server.

    
    
    Python 2.7.5 (default, Mar  9 2014, 22:15:05) 
    [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from datetime import datetime
    >>> date = datetime.strptime('2013-08-15 10:23:05 PDT', '%Y-%m-%d %H:%M:%S %Z')
    >>> print(date)
    2013-08-15 10:23:05
    

Why does this not work in 2.7.6 on Ubuntu?

    
    
    Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
    [GCC 4.8.2] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from datetime import datetime
    >>> date = datetime.strptime('2013-08-15 10:23:05 PDT', '%Y-%m-%d %H:%M:%S %Z')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python2.7/_strptime.py", line 325, in _strptime
        (data_string, format))
    ValueError: time data '2013-08-15 10:23:05 PDT' does not match format '%Y-%m-%d %H:%M:%S %Z'
    

Edit: I tried using the timezone offset with the lowercase %z, but still get
an error (although a different one):

    
    
    >>> date = datetime.strptime('2013-08-15 10:23:05 -0700', '%Y-%m-%d %H:%M:%S %z')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 317, in _strptime
        (bad_directive, format))
    ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S %z'
    


Answer: Timezone abbreviations are ambiguous. [For
example](http://stackoverflow.com/a/22364003/190597), EST can mean Eastern
Standard Time in the US, or it could mean Eastern Summer Time in Australia.

Therefore, datetime strings which contain timezone abbreviations can not be
reliably parsed into timezone-aware datetime objects.

`strptime`'s `'%Z'` format will only match UTC, GMT or the timezone
abbreviation listed in `time.tzname`, which is machine-locale dependent.

If you can change the datetime strings to ones containing UTC offsets, then
you could use [dateutil](http://niemeyer.net/python-dateutil) to parse the
strings into timezone-aware datetime objects:

    
    
    import dateutil
    import dateutil.parser as DP
    date = DP.parse('2013-08-15 10:23:05 -0700')
    print(repr(date))
    # datetime.datetime(2013, 8, 15, 10, 23, 5, tzinfo=tzoffset(None, -25200))
    

