【问题标题】:ValueError: String does not contain a date. Issues with Delorean, Dateutil and functions working in some places, but not othersValueError:字符串不包含日期。 Delorean、Dateutil 和函数在某些地方工作的问题,但在其他地方却没有
【发布时间】:2016-07-03 18:33:15
【问题描述】:

所以,我想我要疯了。我使用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))

【问题讨论】:

  • 已修复,感谢@J.F.Sebastian 的提醒

标签: python python-2.7 time hubspot delorian


【解决方案1】:

似乎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])},
...

【讨论】:

  • 嘿@Sevanteri 感谢您的回复;我刚刚尝试过,并收到了与上面相同的回溯。但是我尝试了print(ref_date_epoch(row[15])),它按预期返回了1427068800000。太奇怪了。仍然无法工作 - 我想不出任何其他方法可以将row[15] 的值显式提取为字符串...
  • 你记得在payload改行吗?
  • 如果您遇到更多错误,请为他们发布回溯。
  • 我做了,正如您在上面概述的那样。更改了函数和有效负载中的行。
  • 您似乎正在循环一些数据,而在第二个循环中,您的row[15] 实际上是"Hermes Transport Logistics GMBH updated successfully.",这当然不是日期。 :)
【解决方案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

【讨论】:

    猜你喜欢
    • 2014-09-05
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多