ValueError: String не содержит дату. Проблемы с Delorean, Dateutil и функциями, работающими в некоторых местах, но не в других
Итак, я думаю, что схожу с ума. Я использую Delorean, чтобы преобразовать строку в поле CSV row[15]
в дату, которую я затем передаю в parse()
а потом .epoch
, Вот мой импорт:
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
Теперь у меня есть эта функция:
def ref_date_epoch():
ref_date_epoch_result = "{ref_date}000".format(ref_date=int(parse(row[15]).epoch))
return ref_date_epoch_result
Это успешно возвращает объект времени Unix (по крайней мере, в формате, который я могу использовать). Тем не менее, когда я ссылаюсь на эту функцию позже в моем коде, примерно так (это в качестве значения для referral_date
ключ):
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] }
]
}
Я получаю это:
Traceback (most recent call last):
File "wta_goldvision_company_import.py", line 187, in <module>
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.
Почему функция работает сама по себе, а не когда она используется где-то еще? Я попытался просто вручную ввести дату так:
ref_date_epoch_result = "{ref_date}000".format(ref_date=int(parse("23/12/2015").epoch))
И это прекрасно работает. Почему бы dateutil
Функция разбора не имеет проблем, выполняя свою задачу за пределами полезной нагрузки JSON, но как только на нее ссылаются, она не может интерпретировать значение row[15]
как строка - что мне не хватает?
Последняя трассировка:
23/03/2015
Hermes Transport Logistics GMBH updated successfully.
Traceback (most recent call last):
File "wta_goldvision_company_import.py", line 187, in <module>
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.
Это целая функция, в которой находится вышеупомянутое (которая снова является частью большего целого):
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))
2 ответа
Решение:
Оказывается, умственное утомление делает нас всех дураками - я перебирал CSV, и, по-видимому, первый ряд, мой тестовый ряд, как оказалось, был единственным в течение некоторого времени, который фактически содержал дату, следовательно, почему он падал, когда он достиг второго ряда. Итак, я изменил ref_date_epoch
Функция быть такой:
def ref_date_epoch(datestr):
if len(datestr) > 0:
return "{ref_date}000".format(ref_date=int(parse(datestr).epoch))
else:
None
Кажется, что row[15]
является None
на каком-то ряду. Может быть, пустое значение в файле CSV?
Кроме того, вы можете определить ref_date_epoch
функция вне цикла.
Старый ответ:
Вместо того, чтобы положить row[15]
внутри ref_date_epoch
функция, дайте это в качестве аргумента.
def ref_date_epoch(datestr):
return "{ref_date}000".format(ref_date=int(parse(datestr).epoch))
затем
...
{"name":"referral_date", "value": ref_date_epoch(row[15])},
...