Search code examples
pythonsqliteraspberry-pi

why is datetime.strptime not working unable to format?


i am reading a entrance time from sqlite database to calaulate the duration of the car stay. the datetime is currenly able to insert and retrive but when formated to do calualtion it keeps give an error when using the datetime.strptime funtion.EnterTime is stored as a text in the sqlite database.

import sqlite3
import smtplib
from datetime import datetime, timedelta

# Connect to the database
conn = sqlite3.connect("py.db")

# Get current time
current_time = datetime.now()

# Define the carplate number
carplate = "SJJ4649G"

# Check if the carplate already exists in the database
cursor = conn.cursor()
query = "SELECT * FROM entrance WHERE carplate = ?"
cursor.execute(query, (carplate,))
result = cursor.fetchall()

# If the carplate already exists, send an email
if len(result) > 0:
    # Get the email address from the gov_info table
    query = "SELECT email FROM gov_info WHERE carplate = ?"
    cursor.execute(query, (carplate,))
    email_result = cursor.fetchall()

    # Get the entrance time from the entrance table
    query = "SELECT EnterTime FROM entrance WHERE carplate = ?"
    cursor.execute(query, (carplate,))
    entrance_time_str = cursor.fetchone()[0]
    print (entrance_time_str)
    entrance_time = datetime.strptime(entrance_time_str, "%Y-%m-%d %H:%M:%S")

    # Calculate the cost
    delta = current_time - entrance_time
    cost = delta.total_seconds() / 3600 * 10  # 10 is the hourly rate

    # Email details
    email = "[email protected]"
    password = "ufwdiqcfepqlepsn"
    send_to = email_result[0][0]
    subject = "Parking Fees"
    message = f"The cost for parking the car with plate number {carplate} is ${cost:.2f}. The entrance time was {entrance_time} and the current time is {current_time}."

    # Send the email
    smtp = smtplib.SMTP('smtp.gmail.com', 587)
    smtp.ehlo()
    smtp.starttls()
    smtp.login(email, password)
    smtp.sendmail(email, send_to, f"Subject: {subject}\n\n{message}")
    smtp.quit()

# If the carplate does not exist, insert it into the database
else:
    query = "INSERT INTO entrance (carplate, EnterTime) VALUES (?, ?)"
    cursor.execute(query, (carplate, current_time))
    conn.commit()

# Close the connection
cursor.close()
conn.close()

i have printed the entrance time out and it matches the data shown in the database. i have also tried to remove the fromating that would not let me do the calulations. this is the error i get

2023-02-06 16:07:46.640395
Traceback (most recent call last):
  File "/media/pi/6134-E775/payment.py", line 32, in <module>
    entrance_time = datetime.strptime(entrance_time_str, "%Y-%m-%d %H:%M:%S")
  File "/usr/lib/python3.7/_strptime.py", line 577, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "/usr/lib/python3.7/_strptime.py", line 362, in _strptime
    data_string[found.end():])
ValueError: unconverted data remains: .640395


Solution

  • You need to append .%f to take microseconds:

    entrance_time_str = '2023-02-06 16:07:46.640395'  #              HERE --v
    entrance_time = datetime.strptime(entrance_time_str, "%Y-%m-%d %H:%M:%S.%f")
    
    >>> entrance_time_str
    '2023-02-06 16:07:46.640395'
    
    >>> entrance_time
    datetime.datetime(2023, 2, 6, 16, 7, 46, 640395)