从python3.7在bigquery中插入时间戳值时出错

2024-05-16 00:08:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从python3.7调用一个restapi,得到json格式的api响应。其中一个字段是时间戳字符串,但在json响应中,我得到的是这种格式

create_time {
  seconds: 1604562539
  nanos: 418758000
}

我需要将其插入UTC格式的bigquery表中,该表是一个时间戳字段

所以我将其转换为Json字符串,如下所示

createdtime=json.dumps(创建时间,默认为datetime\u处理程序)

def datetime_handler(dt):
    if isinstance(dt, datetime):
        return dt.isoformat()
    raise TypeError("Unknown type")

这给了我一个json字符串,格式如下2020-11-05T07:48:59.418758+00:00

接下来,我需要通过将这个值传递给bigquery请求,尝试将这个create_时间插入到时间戳字段中的大查询表中,然后得到插入错误

 'bigquery#tableDataInsertAllResponse', 'insertErrors': [{'index': 0, 'errors': [{'reason': 'invalid', 'location': 'createdtime', 'debugInfo': '', 'message': 'Could not parse \'"2020-11-05T07:48:59.418758+00:00"\' as a timestamp. Required format is YYYY-MM-DD HH:MM[:SS[.SSSSSS]]'}]}

因此,我删除了偏移量(00:00),现在日期变为2020-11-05T07:48:59.418758,我再次将其传递给bigquery,我得到了相同的错误

'bigquery#tableDataInsertAllResponse', 'insertErrors': [{'index': 0, 'errors': [{'reason': 'invalid', 'location': 'createdtime', 'debugInfo': '', 'message': 'Could not parse \'"2020-11-05T07:48:59.418758"\' as a timestamp. Required format is YYYY-MM-DD HH:MM[:SS[.SSSSSS]]'}]},

最后,我用Z替换偏移量,createdtime变为2020-11-05T07:48:59.418758Z,并将其传递给bigquery,得到相同的结果

**Error: {'kind': 'bigquery#tableDataInsertAllResponse', 'insertErrors': [{'index': 0, 'errors': [{'reason': 'invalid', 'location': 'createdtime', 'debugInfo': '', 'message': 'Could not parse \'"2020-11-05T07:48:59.418758Z"\' as a timestamp. Required format is YYYY-MM-DD HH:MM[:SS[.SSSSSS]]'}]}**

最后,根据我在下面收到的一条建议,我已经替换了T,因此现在日期变为2020-11-05 07:48:59.418758 我仍然会遇到同样的错误:

Error: {'kind': 'bigquery#tableDataInsertAllResponse', 'insertErrors': [{'index': 0, 'errors': [{'reason': 'invalid', 'location': 'createdtime', 'debugInfo': '', 'message': 'Could not parse \'"2020-11-05 07:48:59.418758"\' as a timestamp. Required format is YYYY-MM-DD HH:MM[:SS[.SSSSSS]]'}]},

我对python3.7非常陌生,也不太熟悉python和bigquery中的时间戳值,有人能推荐一个解决方案吗?谢谢

这是我把所有不相关的部分也放在这里的代码,以便于理解:

    row={}
rows=[]
     def datetime_handler(dt):
            if isinstance(dt, datetime):
                return dt.isoformat()
            raise TypeError("Unknown type")
     createdtime=json.dumps(snapshotresponse.create_time,default=datetime_hander)
    createdtime=createdtime.replace("+00:00", "").replace('T'," ")
    row["createdTime"]= createdtime
    json_msg = {
                           "json": row
                        }
    rows.append(json_msg)
    body = {
            "kind": "bigquery#tableDataInsertAllRequest",
            "skipInvalidRows": "false",
            "rows": rows
                }
 

Tags: jsondatetimeindex格式时间dtlocationbigquery
2条回答

所需格式如下: YYYY-MM-DD HH:MM[:SS[.SSSSSS]]

你有一个“T”你需要摆脱:

date_time_str = '2020-11-05T07:48:59.418758'.replace('T', ' ')


编辑:

我避免创建一个datetime对象,只是为了使它成为一个字符串,然后再将它发送到一个dt对象,因为您已经有了一个json值。但是,如果你做一个简单的打印(date\u time\u str),我想你可以很容易地将它匹配到所需的格式,然后看看有什么问题

如果您没有看到格式问题,我会建议使用hatef Alipoor的建议,并将实际日期时间字符串化

所需格式:YYYY-MM-DD HH:MM[:SS[.ssss]]

from datetime import datetime

sec = 1604562539
nano = 418758000
total_sec = sec + nano / 1000000000
dt = datetime.utcfromtimestamp(total_sec)
dt.strftime('%Y-%m-%d %H:%M:%S.%f')
# '2020-11-05 07:48:59.418758'

相关问题 更多 >