Данные времени «2024-05» не соответствуют формату «%Y-%m-%dT%H:%M:%S» (Protobuff)

Я создаю протобуфер из json, и структура json выглядит следующим образом:

    {
      "answerUpdateRequest": {
        "entity": {
          "type": "ORGANIZATION",
          "id": "UU1234321234ID"
        },
        "answers": [
          {
            "key": "legal_company_name",
            "source": {
              "type": "DOCUMENT",
              "id": "3ea20440-83fb-43c0-b409-1dd8f68e73ec | DocumentType.application"
            },
            "provided_at": "2024-05-02T15:54:15.941988",
            "received_at": "2024-05-02T15:54:15.945350",
            "type": "TEXT",
            "value": {
              "text": "Ciccone Law, LLC"
            }
          },
          {
            "key": "company_website_ind",
            "source": {
              "type": "DOCUMENT",
              "id": "3ea20440-83fb-43c0-b409-1dd8f68e73ec | DocumentType.application"
            },
            "provided_at": "2024-05-02T15:54:15.941988",
            "received_at": "2024-05-02T15:54:15.945365",
            "type": "BOOLEAN",
            "value": {
              "text": "Yes"
            }
          },
          {
            "key": "company_webiste",
            "source": {
              "type": "DOCUMENT",
              "id": "3ea20440-83fb-43c0-b409-1dd8f68e73ec | DocumentType.application"
            },
            "provided_at": "2024-05-02T15:54:15.941988",
            "received_at": "2024-05-02T15:54:15.945388",
            "type": "TEXT",
            "value": {
              "text": "www.Justice-Insight.com"
            }
          }
          
        ]
      },
      "documentKey": "3ea20440-83fb-43c0-b409-1dd8f68e73ec",
      "applicationId": "1343245432",
      "activityId": "1111"
    }
    def create_answer_update_request(json_data):
        data = json_data
        print("Data is "+str(data))
        answer_update_request = events_pb2.AnswerUpdateRequest()
        answer_update_request.entity.type = model_pb2.Entity.Type.Value(data["answerUpdateRequest"]["entity"]["type"])
        answer_update_request.entity.id = data["answerUpdateRequest"]["entity"]["id"]
    
        # Convert answers to protobuf format
        for answer_data in data["answerUpdateRequest"]["answers"]:
            answer = answer_update_request.answers.add()
            answer.key = answer_data["key"]
            answer.source.type = answer_data["source"]["type"]
            answer.source.id = answer_data["source"]["id"]
    
            # Handle provided_at and received_at fields
            provided_at_str = answer_data["provided_at"].split('.')[0]
            print(provided_at_str)
    
            provided_at_datetime = datetime.strptime(provided_at_str, "%Y-%m-%dT%H:%M:%S")
    
            provided_at = Timestamp()
            provided_at.FromJsonString(provided_at_datetime.isoformat())
            print("##########provided_at############")
            answer.provided_at.CopyFrom(provided_at_datetime.isoformat())
    
            received_at_str = answer_data["received_at"]
            if len(received_at_str) == 7:  # Only contains 'YYYY-MM'
                received_at_str += "-01T00:00:00"  # Append default day and time
            received_at = Timestamp()
            received_at.FromJsonString(received_at_str)
            answer.received_at.CopyFrom(received_at)
    
            # Ensure the type value is valid and convert it
            if answer_data["type"] not in events_pb2.Answer.Type.keys():
                raise ValueError(f"Invalid answer type: {answer_data['type']}")
            answer.type = events_pb2.Answer.Type.Value(answer_data["type"])
    
            # Handle different value types based on your schema
            if answer_data["type"] == "TEXT":
                answer.value.text = answer_data["value"]["text"]
            elif answer_data["type"] == "BOOLEAN":
                answer.value.boolean = answer_data["value"]["boolean"]
            # Add handling for other types as needed
    
        # Serialize message
        serialized_data = answer_update_request.SerializeToString()
    
        return serialized_data

Я попробовал распечатать provided_at_str и он печатает "2024-05-16T22:20:28"

Error: 
   tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '2024-05' does not match format '%Y-%m-%dT%H:%M:%S'
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если я правильно понимаю, вы пытаетесь преобразовать строку в объект datetime, и, очевидно, в этом процессе есть ошибка.

Официальную документацию смотрите здесь.

Короткий ответ

import datetime

t = "2024-05-02T15:54:15.941988"

print(datetime.datetime.strptime(t, "%Y-%m-%dT%H:%M:%S.%f"))
Ответ принят как подходящий

Ух, дата-время :-)

Я думаю, что ваши даты недействительны RFC-3339.

Без смещения часового пояса, я думаю, они должны прекратить работу Z

Если вам нужно добавить Z к датам, вы сможете FromJsonString:

Вы не включаете свой источник Protobuf:

foo.proto:

syntax = "proto3";

import "google/protobuf/timestamp.proto";

message Foo {
    google.protobuf.Timestamp provided_at = 1;
    google.protobuf.Timestamp received_at = 2;
}
def add_Z(s: str) -> str:
    return f"{s}Z"

if __name__ == "__main__":
    data = json.loads(JSON)

    foo = foo_pb2.Foo()
    for answer in data["answerUpdateRequest"]["answers"]:    
        foo.provided_at.FromJsonString(add_Z(answer["provided_at"]))
        foo.received_at.FromJsonString(add_Z(answer["received_at"]))
        print(foo)

Выход:

provided_at {
  seconds: 1714665255
  nanos: 941988000
}
received_at {
  seconds: 1714665255
  nanos: 945350000
}

provided_at {
  seconds: 1714665255
  nanos: 941988000
}
received_at {
  seconds: 1714665255
  nanos: 945365000
}

provided_at {
  seconds: 1714665255
  nanos: 941988000
}
received_at {
  seconds: 1714665255
  nanos: 945388000
}

Другие вопросы по теме