将日期时间解析为protobuf时间戳

问题描述 投票:0回答:1

我正在尝试将日期时间元素解析为 Python 中的 protobuf 时间戳,因为 Google Cloud Optimization V1 要求所有日期时间字段采用这种格式。然而,我在这方面遇到了困难,例如,我正在尝试:

startTime=Timestamp().FromDatetime(timeWindow.startTime)

但我得到:

Traceback (most recent call last):
File "C:\Users\allombart\AppData\Local\pypoetry\Cache\virtualenvs\fresctrans-yzUGheRy-py3.12\Lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 408, in run_asgi
result = await app(  # type: ignore[func-returns-value]
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\allombart\AppData\Local\pypoetry\Cache\virtualenvs\fresctrans-yzUGheRy-py3.12\Lib\site-packages\uvicorn\middleware\proxy_headers.py", line 84, in __call__
return await self.app(scope, receive, send)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\allombart\AppData\Local\pypoetry\Cache\virtualenvs\fresctrans-yzUGheRy-py3.12\Lib\site-packages\fastapi\applications.py", line 1106, in __call__
await super().__call__(scope, receive, send)
  File "C:\Users\allombart\AppData\Local\pypoetry\Cache\virtualenvs\fresctrans-yzUGheRy-py3.12\Lib\site-packages\starlette\applications.py", line 122, in __call__
await self.middleware_stack(scope, receive, send)
  File "C:\Users\allombart\AppData\Local\pypoetry\Cache\virtualenvs\fresctrans-yzUGheRy-py3.12\Lib\site-packages\starlette\middleware\errors.py", line 184, in __call__
raise exc
  File "C:\Users\allombart\AppData\Local\pypoetry\Cache\virtualenvs\fresctrans-yzUGheRy-py3.12\Lib\site-packages\starlette\middleware\errors.py", line 162, in __call__
await self.app(scope, receive, _send)
  File "C:\Users\allombart\Projectes\fresctrans\src\backframe\__init__.py", line 11, in __call__
return await self.app(scope, receive, send)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\allombart\AppData\Local\pypoetry\Cache\virtualenvs\fresctrans-yzUGheRy-py3.12\Lib\site-packages\starlette\middleware\exceptions.py", line 79, in __call__
raise exc
  File "C:\Users\allombart\AppData\Local\pypoetry\Cache\virtualenvs\fresctrans-yzUGheRy-py3.12\Lib\site-packages\starlette\middleware\exceptions.py", line 68, in __call__
await self.app(scope, receive, sender)
  File "C:\Users\allombart\AppData\Local\pypoetry\Cache\virtualenvs\fresctrans-yzUGheRy-py3.12\Lib\site-packages\fastapi\middleware\asyncexitstack.py", line 20, in __call__
raise e
  File "C:\Users\allombart\AppData\Local\pypoetry\Cache\virtualenvs\fresctrans-yzUGheRy-py3.12\Lib\site-packages\fastapi\middleware\asyncexitstack.py", line 17, in __call__
await self.app(scope, receive, send)
  File "C:\Users\allombart\AppData\Local\pypoetry\Cache\virtualenvs\fresctrans-yzUGheRy-py3.12\Lib\site-packages\starlette\routing.py", line 718, in __call__
await route.handle(scope, receive, send)
  File "C:\Users\allombart\AppData\Local\pypoetry\Cache\virtualenvs\fresctrans-yzUGheRy-py3.12\Lib\site-packages\starlette\routing.py", line 276, in handle
await self.app(scope, receive, send)
  File "C:\Users\allombart\AppData\Local\pypoetry\Cache\virtualenvs\fresctrans-yzUGheRy-py3.12\Lib\site-packages\starlette\routing.py", line 66, in app
response = await func(request)
           ^^^^^^^^^^^^^^^^^^^
  File "C:\Users\allombart\AppData\Local\pypoetry\Cache\virtualenvs\fresctrans-yzUGheRy-py3.12\Lib\site-packages\fastapi\routing.py", line 274, in app
raw_response = await run_endpoint_function(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\allombart\AppData\Local\pypoetry\Cache\virtualenvs\fresctrans-yzUGheRy-py3.12\Lib\site-packages\fastapi\routing.py", line 191, in run_endpoint_function
return await dependant.call(**values)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\allombart\Projectes\fresctrans\src\fresctrans\utils.py", line 21, in wrapper
result = await fn(*args, **kwargs)
         ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\allombart\Projectes\fresctrans\src\fresctrans\ctrl\fleet.py", line 139, in calculate_routes_automatically
return await fleet_optimizer_service.daily_route_calculation()
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\allombart\Projectes\fresctrans\src\fresctrans\service\fleet\optimizer\fleet_optimizer.py", line 128, in daily_route_calculation
fromShipmentToShipmentDTO(shipment) for shipment in shipments
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\allombart\Projectes\fresctrans\src\fresctrans\service\fleet\optimizer\model.py", line 506, in fromShipmentToShipmentDTO
fromDeliveryToDeliveryDTO(delivery) for delivery in shipment.deliveries
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\allombart\Projectes\fresctrans\src\fresctrans\service\fleet\optimizer\model.py", line 453, in fromDeliveryToDeliveryDTO
startTime=Timestamp().FromDatetime(timeWindow.startTime),
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\allombart\AppData\Local\pypoetry\Cache\virtualenvs\fresctrans-yzUGheRy-py3.12\Lib\site-packages\google\protobuf\internal\well_known_types.py", line 255, in FromDatetime
self.seconds = calendar.timegm(dt.utctimetuple())
^^^^^^^^^^^^
AttributeError: 'Timestamp' object has no attribute 'seconds'

我正在尝试通过以下方式导入时间戳:

from google.protobuf.timestamp_pb2 import Timestamp

而且,即使 protobuf 包已正确安装在诗歌中,我得到:

    Cannot find reference 'Timestamp' in 'timestamp_pb2.py' 

所以,我能够导入时间戳的唯一方法是

from google.protobuf.internal.well_known_types import Timestamp

长话短说,将日期时间元素解析为时间戳的正确方法是什么?

python datetime timestamp grpc-python
1个回答
0
投票

再次尝试使用pip安装protobuf 如果您仍然无法导入,请尝试以下操作:

文件:

timestamp.proto

syntax = "proto3";
package google.protobuf;

message Timestamp {
    int64 seconds = 1;
    int32 nanos = 2;
}

使用

protoc -I=. --python_out=. timestamp.proto

编译它

然后在你的代码中

from datetime import datetime
from timestamp_pb2 import Timestamp

startTime = datetime.strptime('Tue Feb 27 2024 13:22:34.271005', '%a %b %d %Y %H:%M:%S.%f') 
# setting arbitrary start time for demo 

startTimeProto = Timestamp()
startTimeProto.FromDatetime(startTime) 
print(startTimeProto)

# seconds: 1709040154
# nanos: 271005000

© www.soinside.com 2019 - 2024. All rights reserved.