Subtracting dates to get hours and minutes
Thomas Passin
list1 at tompassin.net
Thu Dec 15 17:35:26 EST 2022
Oops,
"items = dstr[1:-2].split(',')"
should have read
"items = dstr[1:-1].split(',')".
On 12/15/2022 1:56 PM, Thomas Passin wrote:
> It's hard to be sure from what you have offered, but I suspect that you
> are taking the string "(2022, 12, 13, 5, 3, 30)" from the file and
> using it as is. When you feed that in as a starred argument, the string
> gets treated as a sequence where each item is a character in the string.
> Your example contains 26 characters, which matches the error message,
> so that's probably what is going on.
>
> You need to convert the string into the correct integers, because is the
> datetime function expects to get integers, not strings. It isn't going
> to work with a string that looks like a tuple when it is printed.
>
> Here is one way you could do this. From the input file, extract the
> string. Call it dstr. Then you have to get rid of the parentheses and
> separate out each item so you can convert it into an integer. So:
>
> items = dstr[1:-2].split(',') # This creates a list of strings.
> # print(items) --> ['2022', ' 12', ' 13', ' 5', ' 3', ' 3']
>
> # Create a tuple of integers from the string items
> seq = (int(n) for n in items)
> # or make it a list instead: seq = [int(n) for n in items]
>
> # And here is the datetime object you wanted
> d1 = datetime.datetime(*seq)
>
>
> On 12/15/2022 1:14 PM, Gronicus at SGA.Ninja wrote:
>> So far so good , I can now use a variable in datetime.datetime but it
>> only
>> works if I hard-code the time/date information. Now I want to have the
>> code
>> read from a file but I get: TypeError: function takes at most 9 arguments
>> (26 given)
>>
>> I figure that the structure in the file is incorrect. What should it
>> be? The
>> entry in the file is (2022, 12, 13, 5, 3, 30) but when my program
>> tries to
>> use it I get the error.
>>
>> The program is a bit more sophisticated now but here is the update with a
>> sample of the SPECIFICATIONS.txt file:
>> =====================================================================
>>
>> # This program compares two Timedate values, subtracts the two and
>> # converts the difference to seconds and hours.
>> #
>>
>> # %A Monday # %a Mon # %B January # %b Jan
>> # %d 05 day # %m month as 01 # %Y 2020 # %y 20
>> # %H 24 # %I 12 # %M 30 min # %S Seconds
>>
>> import time
>> import datetime
>> from time import gmtime, strftime ##define strftime as time/date right
>> now
>> # ======================================================
>>
>> def GetSpecByItem(GetThisOne): #get line by item in column 4 - 7
>> ItemValue = "--"
>> with open("SPECIFICATIONS.txt" , 'r') as infile:
>> for lineEQN in infile: # loop to find each line in the file for
>> that
>> dose
>> if ((lineEQN[4:7]== GetThisOne)):
>> ItemValue = lineEQN[30:60].strip() # Just the Data
>> return(ItemValue)
>>
>> """
>> SPECIFICATIONS.txt
>>
>> IYf HRB Humalog R Date (2018, 12, 4, 10, 7, 00) ##
>> IYf HRG Humulin R Date (2022, 12, 13, 5, 3, 30) ##
>> """
>> # ====================== Main() ======================================
>> print()
>> Startt = "404"
>> Stopp = "404"
>>
>> Answer = "Y"
>> Answer = input("Run test A? (" + Answer + ")" )
>>
>> if Answer == "Y" or Answer == "y" or Answer == "":
>> print()
>> print(" Running Test A:")
>> # Year Mth Day Hour Min Sec
>> Startt = 2018, 12, 4, 10, 7, 00
>> Stopp = 2022, 12, 12, 1, 15, 30
>> NowTime = 2022, 12, 14, 21, 15, 30
>> else:
>> print(" Running Test B:")
>> Startt = GetSpecByItem("HRG")
>> Stopp = GetSpecByItem("HRB")
>> NowTime = strftime("(%Y, %m, %d, %H, %M, %S)")
>> print()
>> print("55 NowTime = " + str(NowTime))
>> print("56 Startt = " + str(Startt))
>> print("57 Stopp = " + str(Stopp))
>> print()
>>
>> NowTime = datetime.datetime(*NowTime)
>> Startt = datetime.datetime(*Startt)
>> Stopp = datetime.datetime(*Stopp)
>>
>> #Start == Startt # True"
>> #print("Startt test = " + Start)
>> # =================================================
>> print()
>> c = NowTime - Stopp
>> minutes = c.total_seconds() / 60
>> minutes = c.seconds / 60
>> hours = 0
>>
>> while (minutes > 59):
>> minutes = minutes - 60
>> hours += 1
>> minutes = round(minutes)
>> print ("77 Hours = <" + str(hours) + ">")
>> print ("78 Minutes = <" + str(minutes) + ">")
>> if hours > 7:
>> print(" Time to inject Humulin R u500.")
>>
>> pause = input("Pause")
>> # ======================================================
>>
>>
>> -----Original Message-----
>> From: Python-list <python-list-bounces+gronicus=sga.ninja at python.org> On
>> Behalf Of Thomas Passin
>> Sent: Tuesday, December 13, 2022 11:20 PM
>> To: python-list at python.org
>> Subject: Re: Subtracting dates to get hours and minutes
>>
>> Your problem is that datetime.datetime does not accept a tuple as an
>> argument. It expects an integer value for the first argument, but you
>> supplied a tuple. In Python, you can use a sequence (e.g., tuple or
>> list) the way you want by prefixing it with an asterisk. This causes the
>> sequence of items to be treated as individual arguments. So:
>>
>> Startt = datetime.datetime(2022, 12, 13, 5, 3, 30)
>> st1 = (2022, 12, 13, 5, 3, 30)
>> dts1 = datetime.datetime(*st1) # NOT datetime.datetime(st1)
>> dts1 == Startt # True
>>
>> On 12/13/2022 10:43 PM, Gronicus at SGA.Ninja wrote:
>>> As is, Test A works.
>>> Comment out Test A and uncomment Test B it fails.
>>> In Test B, I move the data into a variable resulting with the report:
>>> "TypeError: an integer is required (got type tuple)
>>>
>>> How do I fix this?
>>>
>>> #---------------------------------------------------------------------
>>> --------
>>> import datetime
>>> #=================================================
>>> # Test A Hard coded Date/Time
>>> Startt = datetime.datetime(2022, 12, 13, 5, 3, 30) Stopp =
>>> datetime.datetime(2022, 12, 12, 21, 15, 30)
>>>
>>> # =================================================
>>> # Test B Date/Time data as a variable
>>> #Startt = (2022, 12, 13, 5, 3, 30)
>>> #Stopp = (2022, 12, 12, 21, 15, 30)
>>>
>>> #Startt = datetime.datetime(Startt)
>>> #Stopp = datetime.datetime(Stopp)
>>>
>>> # =================================================
>>> c = Startt - Stopp
>>> minutes = c.total_seconds() / 60
>>> minutes = c.seconds / 60
>>> hours = 0
>>>
>>> while (minutes > 59):
>>> minutes = minutes - 60
>>> hours += 1
>>> minutes = round(minutes)
>>> print()
>>> print (" Hours = <" + str(hours) + ">")
>>> print (" Minutes = <" + str(minutes) + ">")
>>>
>>> #
>>> ----------------------------------------------------------------------
>>> -------
>>>
>>
>> --
>> https://mail.python.org/mailman/listinfo/python-list
>>
>
More information about the Python-list
mailing list