【问题标题】:ValueError: Unknown protobuf attr type <type 'datetime.date'>ValueError: Unknown protobuf attr type <type 'datetime.date'>
【发布时间】:2018-01-26 08:12:51
【问题描述】:

执行代码时出错。我有一个数据存储实体,它具有日期类型的属性。为特定行存储在实体中的示例日期属性值是 2016-01-03 (19:00:00.000) EDT

我正在执行的代码是根据大于 2016-01-01 的日期过滤实体值。知道代码有什么问题

错误

ValueError: Unknown protobuf attr type <type 'datetime.date'>

代码

import pandas as pd
import numpy as np
from datetime import datetime

from google.cloud import datastore
from flask import Flask,Blueprint
app = Flask(__name__)

computation_cron= Blueprint('cron.stock_data_transformation', __name__)
@computation_cron.route('/cron/stock_data_transformation')
def cron():
ds = datastore.Client(project="earningspredictor-173913")
query = ds.query(kind='StockPrice')
query.add_filter('date', '>', datetime.strptime("2016-01-01", '%Y-%m-%d').date())

dataframe_data = []
temp_dict = {}
for q in query.fetch():
    temp_dict["stock_code"] = q["stock_code"]
    temp_dict["date"] = q["date"]
    temp_dict["ex_dividend"] = q["ex_dividend"]
    temp_dict["split_ratio"] = q["split_ratio"]
    temp_dict["adj_open"] = q["adj_open"]
    temp_dict["adj_high"] = q["adj_high"]
    temp_dict["adj_low"] = q["adj_low"]
    temp_dict["adj_close"] = q["adj_close"]
    temp_dict["adj_volume"] = q["adj_volume"]
    dataframe_data.append(temp_dict)
sph = pd.DataFrame(data=dataframe_data,columns=temp_dict.keys())
# print sph.to_string()
query = ds.query(kind='EarningsSurprise')
query.add_filter('act_rpt_date', '>', datetime.strptime("2016-01-01", '%Y-%m-%d').date())

dataframe_data = []
temp_dict = {}
for q in query.fetch():
    temp_dict["stock_code"] = q["stock_code"]
    temp_dict["eps_amount_diff"] = q["eps_amount_diff"]
    temp_dict["eps_actual"] = q["eps_actual"]
    temp_dict["act_rpt_date"] = q["act_rpt_date"]
    temp_dict["act_rpt_code"] = q["act_rpt_code"]
    temp_dict["eps_percent_diff"] = q["eps_percent_diff"]
    dataframe_data.append(temp_dict)
es = pd.DataFrame(data=dataframe_data,columns=temp_dict.keys())

【问题讨论】:

  • 模型定义在哪里?

标签: google-app-engine google-cloud-datastore


【解决方案1】:

您似乎使用的是通用的 google-cloud-datastore 客户端库,而不是 NDB Client Library

对于google-cloud-datastore,所有日期和/或时间属性都具有相同的格式。来自Date and time

  • JSON
    • 字段名称:timestampValue
    • 类型:字符串(RFC 3339 格式,以毫秒为单位,例如2013-05-14T00:01:00.234Z
  • 协议缓冲区
    • 字段名称:timestamp_value
    • 类型:Timestamp
  • 排序顺序:按时间顺序排列
  • 注意:存储在 Cloud Datastore 中时,仅精确到微秒;任何额外的精度都会向下舍入。

因此,在设置/比较此类属性时,请尝试使用指定格式的字符串(或 protobuf Timestamp? 的整数?),而不是直接来自 datetime 模块的对象(与 NDB 库一起使用)。 可能同样适用于查询。

注意:这仅基于文档,我自己没有使用通用库。

【讨论】:

  • 如何在 python 中构建 RFC 3339 格式的时间戳(2016-01-03 (19:00:00.000) EDT)值以与另一个时间戳值进行比较?
  • 获取错误文件“/Users/Ram/fintech-api/flex/internal/cron/stock_data_transformation.py”,第 3 行,在 from datetime import tzinfo, timedelta, datetime, timezone ImportError: 无法导入名称时区
猜你喜欢
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 2018-01-14
  • 2022-08-22
  • 2014-12-17
  • 2017-04-28
相关资源
最近更新 更多