ValueError: String does not contain a date. Issues with Delorean, Dateutil and functions working in some places, but not others
<p>So, I think i'm going insane. I'm using <a href="http://delorean.readthedocs.org/en/latest/index.html" rel="nofollow">Delorean</a> to convert a string in a CSV field <code>row[15]</code> into a date, which I then pass into <code>parse()</code> and then <code>.epoch</code>. Here are my imports:</p>

<pre><code>import sys
import os.path
import requests
import json
import csv
import glob2
import shutil
from time import sleep
from time import gmtime, strftime
from delorean import Delorean
from delorean import parse
from delorean import epoch
</code></pre>

<p>I now have this function:</p>

<pre><code>def ref_date_epoch():
    ref_date_epoch_result = "{ref_date}000".format(ref_date=int(parse(row[15]).epoch))
    return ref_date_epoch_result
</code></pre>

<p>This successfully returns a Unix time object (at least in a format I can use). However, when I reference this function later on in my code, like so (it's towards the bottom as a value for the <code>referral_date</code> key):</p>

<pre><code>        update_company_payload = {
                    "properties": [
                        {"name":"name", "value": row[0] },
                        {"name":"hubspot_owner_id", "value": hubspot_owner_id },
                        {"name":"account_type", "value": row[2] },
                        {"name":"industry", "value": row[3] },
                        {"name":"product", "value": row[4] },
                        {"name":"address", "value": row[5] },
                        {"name":"address2", "value": row[6] },
                        {"name":"city", "value": row[7] },
                        {"name":"state", "value": row[8] },
                        {"name":"zip", "value": row[9] },
                        {"name":"country", "value": row[10] },
                        {"name":"phone", "value": row[11] },
                        {"name":"website", "value": row[12] },
                        {"name":"credit_safe_limit", "value": row[13] },
                        {"name":"credit_safe_rating", "value": row[14] },
                        {"name":"referral_date", "value": ref_date_epoch() },
                        {"name":"referred_from", "value": row[16] },
                        {"name":"referred_to", "value": row[17] },
                        {"name":"source", "value": row[18] }
                      ]
                }
</code></pre>

<p>I get this:</p>

<pre><code>Traceback (most recent call last):
  File "wta_goldvision_company_import.py", line 187, in &lt;module&gt;
    run()
  File "wta_goldvision_company_import.py", line 183, in run
    update_company(create_company(), get_owner_id())
  File "wta_goldvision_company_import.py", line 162, in update_company
    {"name":"referral_date", "value": ref_date_epoch() },
  File "wta_goldvision_company_import.py", line 141, in ref_date_epoch
    ref_date_epoch_result = "{ref_date}000".format(ref_date=int(parse(row[15]).epoch))
  File "build/bdist.macosx-10.11-intel/egg/delorean/interface.py", line 68, in parse
  File "build/bdist.macosx-10.11-intel/egg/dateutil/parser.py", line 1161, in parse
  File "build/bdist.macosx-10.11-intel/egg/dateutil/parser.py", line 555, in parse
ValueError: String does not contain a date.
</code></pre>

<p>Why does the function work on it's own, but not when its used elsewhere? I've tried just manually entering the date like so:</p>

<pre><code>ref_date_epoch_result = "{ref_date}000".format(ref_date=int(parse("23/12/2015").epoch))
</code></pre>

<p>And it works fine. Why would the <code>dateutil</code> parse function have no problems doing its thing outside of the JSON payload, but as soon as it gets referenced inside that thing, it can't seem to interpret the value of <code>row[15]</code> as a string - what am I missing?</p>

<p><strong>Latest Traceback:</strong></p>

<pre><code>23/03/2015
Hermes Transport Logistics GMBH updated successfully.

Traceback (most recent call last):
  File "wta_goldvision_company_import.py", line 187, in &lt;module&gt;
    run()
  File "wta_goldvision_company_import.py", line 183, in run
    update_company(create_company(), get_owner_id())
  File "wta_goldvision_company_import.py", line 162, in update_company
    {"name":"referral_date", "value": ref_date_epoch(row[15]) },
  File "wta_goldvision_company_import.py", line 142, in ref_date_epoch
    return "{ref_date}000".format(ref_date=int(parse(datestr).epoch))
  File "build/bdist.macosx-10.11-intel/egg/delorean/interface.py", line 68, in parse
  File "build/bdist.macosx-10.11-intel/egg/dateutil/parser.py", line 1161, in parse
  File "build/bdist.macosx-10.11-intel/egg/dateutil/parser.py", line 555, in parse
ValueError: String does not contain a date.
</code></pre>

<p>This is the entire function that the above resides in (which again is part of a larger whole):</p>

<pre><code>def update_company( company_id, hubspot_owner_id ):

    # Allows HubSpot 15 seconds to reflect the changes made by the create_company() and get_owner_id() functions.
    sleep(15.0)

    # Open the CSV, use commas as delimiters, store it in a list called "data", then find the length of that list.
    with open(os.path.basename(theCSV),"r") as f:
        reader = csv.reader(f, delimiter = ",", quotechar="\"")
        next(reader)
        for row in reader:

            def ref_date_epoch(datestr):
                print(datestr)
                return "{ref_date}000".format(ref_date=int(parse(datestr).epoch))

            # Set up the JSON payload ...
            update_company_payload = {
                        "properties": [
                            {"name":"name", "value": row[0] },
                            {"name":"hubspot_owner_id", "value": hubspot_owner_id },
                            {"name":"account_type", "value": row[2] },
                            {"name":"industry", "value": row[3] },
                            {"name":"product", "value": row[4] },
                            {"name":"address", "value": row[5] },
                            {"name":"address2", "value": row[6] },
                            {"name":"city", "value": row[7] },
                            {"name":"state", "value": row[8] },
                            {"name":"zip", "value": row[9] },
                            {"name":"country", "value": row[10] },
                            {"name":"phone", "value": row[11] },
                            {"name":"website", "value": row[12] },
                            {"name":"credit_safe_limit", "value": row[13] },
                            {"name":"credit_safe_rating", "value": row[14] },
                            {"name":"referral_date", "value": ref_date_epoch(row[15]) },
                            {"name":"referred_from", "value": row[16] },
                            {"name":"referred_to", "value": row[17] },
                            {"name":"source", "value": row[18] }
                          ]
                    }
            #'https://api.hubapi.com/companies/v2/companies/10444744?hapikey=demo'
            update_company_call = "https://api.hubapi.com/companies/v2/companies/{created_company_id}?hapikey={hapikey}".format(hapikey=wta_hubspot_api_key, created_company_id=company_id)
            headers = {'content-type': 'application/json'}
            data = json.dumps(update_company_payload)
            update_company_response = requests.put(update_company_call, data=data, headers=headers)
            #print(json.dumps(update_company_response.json(), sort_keys=True, indent=4))
            #print (update_company_response.status_code)
            if update_company_response.status_code == 200:
                print("{companyName} updated successfully.".format(companyName=row[0]))
            else:
                print("Something went wrong with the {companyName} update.".format(companyName=row[0]))
                print(json.dumps(update_company_response.json(), sort_keys=True, indent=4))
</code></pre>