Python - ValueError: 時間データ、なし、形式と一致しません、%Y-%m-%dT%H:%M:%S.%f、

okwaves2024-01-24  7

ノード「TransactionDate」には、ポリシー「POL000002NGJ」を更新する前のロジックがあります。 私が実装しようとしているロジックは、既存の 'TransactionDate' < です。今日よりも 5 日を加算し、現在の値を XML に解析します。

XML のトランザクション日付形式: 2020-03-23T10:56:15.00

以下のように DateTime 値を解析すると、正常に動作しますが、値をハードコードしたくありません...形式 "" の日時を処理する文字列オブジェクトとして解析したいことに注意してください。 %Y-%m-%dT%H:%M:%S.%f""...

# <TransactionDate> 
today = datetime.now()
TransactionDate = doc.find('TransactionDate')
Date = '2020-03-24T10:56:15.00' 
previous_update = datetime.strptime(Date, "%Y-%m-%dT%H:%M:%S.%f")

if previous_update < today:
     today = previous_update - timedelta(days=-5)
     TransactionDate = today.strftime("%Y-%m-%dT%H:%M:%S.%f")

DateTime オブジェクトとして解析しているコードの下に、問題があります。ここで問題が発生し、stackoverflow と Python フォーラムの他の回答を参照しましたが、それでもここに構造体があり、問題を解決できませんえ...

修正の助けがあれば、非常に役立ちます。ありがとう。以下のコードでは lxml を使用し、以下のコードをサポートするためのヘルプを取得すると役立ちます。他のノードについてはすでに完了しているためです。私の理解では、Date 変数が None として呼び出されているということです。しかし、ここで修正してください。助けてください。

# <TransactionDate> 
today = datetime.now()
TransactionDate = doc.find('TransactionDate')
Date = str(TransactionDate)
previous_update = datetime.strptime(Date, "%Y-%m-%dT%H:%M:%S.%f")

if previous_update < today:
     today = previous_update - timedelta(days=-5)
     TransactionDate = today.strftime("%Y-%m-%dT%H:%M:%S.%f")

完全なコードは以下です

from lxml import etree
from datetime import datetime, timedelta
import random, string


doc = etree.parse(r'C:\Users\python.xml') 

# <PolicyId> - Random generated policy number
Policy_Random_Choice = 'POL' + ''.join(random.choices(string.digits, k=6)) + 'NGJ'

# <TransactionDate> 
today = datetime.now()
TransactionDate = doc.find('TransactionDate')
Date = str(TransactionDate)  
previous_update = datetime.strptime(Date, "%Y-%m-%dT%H:%M:%S.%f")

if previous_update < today:
     today = previous_update - timedelta(days=-5)
     TransactionDate = today.strftime("%Y-%m-%dT%H:%M:%S.%f")
                                  
#Parsing the Variables
replacements = [Policy_Random_Choice  , TransactionDate ]

targets = doc.xpath('//ROW[PolicyId="POL000002NGJ"]')
for target in targets:
    target.xpath('./PolicyId')[0].text = replacements[0]
    target.xpath('.//TransactionDate')[0].text = replacements[1]
 
print(etree.tostring(doc).decode())

サンプル XML

<TABLE>
   <ROW>
      <PolicyId>POL000002NGJ</PolicyId>
      <BusinessCoverageCode>COV00002D3X1</BusinessCoverageCode>
      <TransactionDate>2020-03-23T10:56:15.00</TransactionDate>
   </ROW>
   <ROW>
      <PolicyId>POL111111NGJ</PolicyId>
      <BusinessCoverageCode>COV00002D3X4</BusinessCoverageCode>
      <TransactionDate>2020-03-23T10:56:15.00</TransactionDate>
   </ROW>
</TABLE>


------------------------

検索方法が間違っている可能性があります。これを試してみてください

# <TransactionDate> 
today = datetime.now()
TransactionDate = doc.xpath('//ROW/TransactionDate') # Change find to xpath
Date = str(TransactionDate[0].text) # Use the first one
previous_update = datetime.strptime(Date, "%Y-%m-%dT%H:%M:%S.%f")

2

ご返信ありがとうございます。この問題は修正されました。修正内容はあなたのロジックとほぼ同じです。

– ラージ

2020 年 9 月 9 日 13:01

つまり、これがあなたが最初に望んでいた答えです:) 次回自分で問題を解決するときは、他の人の参考のためにそれを投稿する必要があります。

– ダビンソウ

2020 年 9 月 10 日 2:51

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。