Let's say I have the following string:
Sat, 14 Sep 2013 22:44:49 +0000
how would I turn it into the following format for Django models?
YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
Thank you very much.
You can use datetime to achieve what you are looking for
from datetime import datetime
date_string = "Sat, 14 Sep 2013 22:44:49 +0000"
initial_format = "%a, %w %b %Y %H:%M:%S %z"
final_format = "%Y-%m-%d %H:%M:%S %z"
datetime.strptime(date_string, initial_format).strftime(final_format)
You can construct the appropriate formats here
Alternatively, for django models, you could just send datetime object as a parameter, and django would convert it to the appropriate format for you.
Related
I have a timestamp column that has a value like this Fri, 12 Mar 2021 14:00:02:270
I want to convert it to timestamp format to use any timestamp-related functions.
Expected output:
2021-03-12 14:00:02
I tried this, but seems its not the right syntax.
cast(date_parse(recordtime,'%a, %d %b %Y %T:%i:%S:')as TIMESTAMP )
From the documentation, the error seems to be at the end of the query, because %T is the format Time, 24-hour (hh:mm:ss), so you don't need to specify %i and %S after that.
This one works:
SELECT cast(date_parse('Fri, 12 Mar 2021 14:00:02:270', '%a, %d %b %Y %T:%f') as timestamp)
You have to add %f at the end to handle the millisecond after your Time format.
I have a calendar/datepicker done in Javascript that creates an input of the following format "Thu Mar 29 2018"
On submit, I want to read the date in a Django date field, but it fails.
What solutions do I have ?
Use datetime.strptime
In your case
from datetime import datetime
datetime_format = "%a %b %d %Y"
date_object = datetime.strptime("Thu Mar 29 2018", datetime_format)
Im trying to convert a string date "11:01 PM - 11 Aug 2009" into a datetime object in python. My code is:
from datetime import datetime
datetime.strptime('11:01 PM - 11 Aug 2009', '%I:%M %p - %d %B %Y')
but I am getting an error: time data '11:01 PM - 11 Aug 2009' does not match format '%I:%M %p - %d %B %Y'
Not sure what I've missed.
the issue was the month is short form so sept instead of september. Had to change it to be %b instead of %B.
Updated code is:
from datetime import datetime
datetime.strptime('11:01 PM - 11 Aug 2009', '%I:%M %p - %d %b %Y')
Use the following:
datetime.strptime('11:01 PM - 11 Aug 2009', '%I:%M %p - %d %b %Y')
%b Month as locale’s abbreviated name.
Jan, Feb, ..., Dec (en_US);
Jan, Feb, ..., Dez (de_DE)
For reference:
https://docs.python.org/3.5/library/datetime.html#strftime-and-strptime-behavior
I tried a couple of times converting this date format
Wed, 02 April 2015 15:50:53 SAST
to this format
YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
but with no luck so far.
Is there any better way to this, that I might have missed?
Here's what I attempted:
date = Wed, 02 April 2015 15:50:53 SAST
splitter = date.split(" ")
joiner = " ".join(splitter[1:len(splitter)-1])
date = datetime.datetime.strptime(joiner,"%d %b %Y %H:%M:%S")
date = datetime.datetime.strftime(date,"%A, %b %d %Y %H:%M:%S %z")
When I'm saving it to the db, I'm receiving this error:
[Wed, 02 April 2015 15:50:53 SAST for that value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format."]
Have a look at strptime (str --> time) and strftime (date --> str).
EDIT:
You are trying to save a string to a DateTimeField. Just remove the string conversion (strftime).
I have a list of strings that I am reading from a file - Each of the strings has a time offset that was recorded while storing the data.
date1= "Mon May 05 20:00:00 EDT 2014"
date2="Mon Nov 18 19:00:00 EST 2013"
date3="Mon Nov 07 19:00:00 PST 2013"
I need to find the difference in days between each pair of strings.
from datetime import datetime
from dateutil import tz
def days_hours_minutes(td):
return td.days, td.seconds//3600, (td.seconds//60)%60
date1='Fri Dec 05 19:00:00 2014' # it does not work with EDT, EST etc.
date2='Fri Dec 03 19:00:00 2014'
fmt = "%a %b %d %H:%M:%S %Y"
str1 = datetime.strptime(date1, fmt)
str2 = datetime.strptime(date2, fmt)
td=(str1-str2)
x=days_hours_minutes(td)
print x
#gives (2, 0, 0)
Basically, convert each string to its "my_time_obj" and then take the difference in days.
However, my actual string dates, have "EDT", "EST", "IST" etc - and on using the %Z notation, I get the ValueError: time data 'Fri Dec 05 19:00:00 EST 2014' does not match format '%a %b %d %H:%M:%S %Z %Y'
from the datetime documentation, I see that I can use %Z to convert this to a timezone notation - what am I missing ?
https://docs.python.org/2/library/datetime.html
I would go with parsing the timezone using pytz and do something like this (given that you know how your date string is built):
from datetime import datetime
from dateutil import tz
from pytz import timezone
def days_hours_minutes(td):
return td.days, td.seconds//3600, (td.seconds//60)%60
date1_str ='Fri Dec 05 19:00:00 2014 EST'
date2_str ='Fri Dec 03 19:00:00 2014 UTC'
fmt = "%a %b %d %H:%M:%S %Y"
date1_list = date1_str.split(' ')
date2_list = date1_str.split(' ')
date1_tz = timezone(date1_list[-1]) # get only the timezone without date parts for date 1
date2_tz = timezone(date2_list[-1]) # get only the timezone without date parts for date 2
date1 = date1_tz.localize(datetime.strptime(' '.join(date1_list[:-1]), fmt)) # get only the date parts without timezone for date 1
date2 = date2_tz.localize(datetime.strptime(' '.join(date2_list[:-1]), fmt)) # get only the date parts without timezone for date 2
td=(date1-date2)
x=days_hours_minutes(td)
print x
Converting time strings to POSIX timestamps and finding the differences using only stdlib:
#!/usr/bin/env python
from datetime import timedelta
from email.utils import parsedate_tz, mktime_tz
dates = [
"Mon May 05 20:00:00 EDT 2014",
"Mon Nov 18 19:00:00 EST 2013",
"Mon Nov 07 19:00:00 PST 2013",
]
ts = [mktime_tz(parsedate_tz(s)) for s in dates] # timestamps
differences = [timedelta(seconds=a - b) for a, b in zip(ts, ts[1:])]
print("\n".join(map(str, differences)))
Read the above links about the inherit ambiguity of the input. If you want a more robust solution; you have to use explicit pytz timezones such as 'America/New_York' or else email module hardcodes "timezone abbr. to utc offset" mapping e.g., EDT -> -0400, EST -> -0500, PST -> -0800.
Output
168 days, 0:00:00
10 days, 21:00:00
differences is a list of timedelta objects, you could get full days using td.days attribute (for non-negative intervals) or to get the value including fractions:
days = td.total_seconds() / 86400