Change '1 Apr 2022, noon' to datetime format python - python

I want to change '1 Apr 2022, noon' to YYYY-MM-DD HH:MM:SS format.
I know the datetime thing in python has the ability to parse but I am unsure how

You can use the dateparser module's parse() function:
>>> from dateparser import parse
>>> parse("1 Apr 2022, noon")
datetime.datetime(2022, 4, 1, 12, 0)
This gets us a datetime.datetime object. We can now call strftime() to format it properly:
>>> date_time = parse("1 Apr 2022, noon")
>>> print(date_time.strftime("%Y-%m-%d %H:%M:%S")
'2022-04-01 12:00:00'

Related

Pyhton3.10 datetime strftime and isocalendar disagreement

I believe that strftime is wrong in the example below. The year should be 2021. isocalendar is right.
Python 3.10.0 (v3.10.0:b494f5935c, Oct 4 2021, 14:59:20) [Clang 12.0.5 (clang-1205.0.22.11)] on darwin
>>> import datetime
>>> datetime.date( 2022, 1, 1 ).strftime( '%Y-%V' )
'2022-52'
>>> datetime.date( 2022, 1, 1 ).isocalendar()
datetime.IsoCalendarDate(year=2021, week=52, weekday=6)
Actually this is the expected behaviour since you are using the %Y format specifier which will return the actual year of the date object.
However you want to use the %G format specifier to return the corresponding ISO year of the date, so try:
import datetime
datetime.date(2022, 1, 1).strftime('%G-%V')
# '2021-52'
Find out more from the docs: https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes

Email Date Conversion in Python

I am capturing the header of an Email to Email Date in the format below:
Fri, 27 Mar 2020 12:05:17 +0000 (UTC)
I need to transform to the format: YYYY-MM-DD HH: MM
I tried to use the datetime.strptime function but to no avail.
Can anyone help me with this? As I'm starting now in Python, I'm taking a beating!
I would use python-dateutil to convert your string to a datetime object, then use strftime to output a string of the desired format.
import datetime
from dateutil import parser
x = parser.parse("Fri, 27 Mar 2020 12:05:17 +0000 (UTC)")
print(x.strftime("%Y-%m-%d %H:%M"))
the output should be
2020-03-27 12:05
A custom implementation without using the datetime library if you don't want that dependency.
date_given = "Fri, 27 Mar 2020 12:05:17 +0000 (UTC)"
month ={'Jan':'01','Feb':'02','Mar':'03','Apr':'04','May':'05','Jun':'06','Jul':'07','Aug':'08','Sep':'09','Oct':'10','Nov':'11','Dec':'12'}
_,d,m,y,t,_,_ = date_given.split(' ')
print(str(y)+"-"+str(month[m])+'-'+str(d)+' '+str(t[:-3]))
Would give you 2020-03-27 12:05
The standard library's email package provides tools to parse RFC5322 format datetime strings.
from email.headerregistry import DateHeader
kwds = {} # This dict is modified in-place
DateHeader.parse('Fri, 27 Mar 2020 12:05:17 +0000 (UTC)', kwds)
kwds['datetime']
datetime.datetime(2020, 3, 27, 12, 5, 17, tzinfo=datetime.timezone.utc)
While DateHeader is the modern tool for parsing date headers, the legacy* function email.utils.parsedate_to_datetime is easier to use
from email.utils import parsedate_to_datetime
parsedate_to_datetime('Fri, 27 Mar 2020 12:05:17 +0000 (UTC)')
datetime.datetime(2020, 3, 27, 12, 5, 17, tzinfo=datetime.timezone.utc)
*While to the docs list the utils module under the legacy API heading, parsedate_to_datetime is used internally by DateHeader to parse datetime strings, so it probably isn't going away any time soon.

Python: datetime format

I have the following datetime string:
Mon Oct 27 23:00:03 +0000 2014
I would like to convert this string to a form where I could compare the datetimes. So, the first thing I tried is converting this to a datetime in Python.
I am having trouble with the correct formatting. I have followed the documentation, but it does not work.
I have tried the following:
str = 'Mon Oct 27 23:00:03 +0000 2014'
datetime.strptime(str, '%a %b %d %X %Z %Y')
How can I get this to work?
If you want to convert it to the datetime object you can use library python-dateutil.
For example:
In [6]: dateutil.parser.parse('Mon Oct 27 23:00:03 +0000 2014')
Out[6]: datetime.datetime(2014, 10, 27, 23, 0, 3, tzinfo=tzutc())
In Python 3.2+:
>>> from datetime import datetime
>>> timestr = 'Mon Oct 27 23:00:03 +0000 2014'
>>> datetime.strptime(timestr, '%a %b %d %X %z %Y')
datetime.datetime(2014, 10, 27, 23, 0, 3, tzinfo=datetime.timezone.utc)
Note the lower case %z.
Here's a stdlib-only version that works on Python 2 and 3:
#!/usr/bin/env python
from datetime import datetime
from email.utils import parsedate_tz, mktime_tz
timestamp = mktime_tz(parsedate_tz('Mon Oct 27 23:00:03 +0000 2014'))
utc_dt = datetime.utcfromtimestamp(timestamp)
# -> datetime.datetime(2014, 10, 27, 23, 0, 3)
where utc_dt is a datetime object that represents time in UTC timezone (regardless of the input timezone).
Note: it doesn't support the time that represents a leap second (though datetime object can't represent it anyway):
>>> datetime.utcfromtimestamp(mktime_tz(parsedate_tz('Tue June 30 23:59:60 +0000 2015')))
datetime.datetime(2015, 7, 1, 0, 0)
Your problem lies with your %z UTC offset value (you should've used a lowercase z). However,
%z is only supported in Python 3.2+
If you are stuck with an older version of Python, you could possibly take out the UTC offset from the string and try converting it after you convert the rest

Calculating days using string dates in Python

I have dates in the current string format: 'Tue Feb 19 00:09:28 +1100 2013'
I'm trying to figure out how many days have passed between the date in the string and the present date.
I've been able to convert the string into a date.
import time
day = time.strptime('Tue Feb 19 00:09:28 +1100 2013', '%a %b %d %H:%M:%S +1100 %Y')
Use the datetime module instead:
import datetime
day = datetime.datetime.strptime('Tue Feb 19 00:09:28 +1100 2013', '%a %b %d %H:%M:%S +1100 %Y')
delta = day - datetime.datetime.now()
print delta.days
Subtracting two datetime.datetime values returns a datetime.timedelta object, which has a days attribute.
Your strings do contain a timezone offset, and you hardcoded it to match; if the value varies you'll have to use a parser that can handle the offset. The python-dateutil package includes both an excellent parser and the timezone support to handle this:
>>> from dateutil import parser
>>> parser.parse('Tue Feb 19 00:09:28 +1100 2013')
datetime.datetime(2013, 2, 19, 0, 9, 28, tzinfo=tzoffset(None, 39600))
Note that because this result includes the timezone, you now need to use timezone-aware datetime objects when using date arithmetic:
>>> from dateutil import tz
>>> import datetime
>>> utcnow = datetime.datetime.now(tz.tzutc())
>>> then = parser.parse('Tue Feb 19 00:09:28 +1100 2013')
>>> utcnow - then
datetime.timedelta(31, 12087, 617740)
>>> (utcnow - then).days
31
I created a utcnow variable in the above example based of the UTC timezone before calculating how long ago the parsed date was.

Parsing the string to Dates in python [duplicate]

This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
Parse date and format it using python?
I'm very new to Python. I have the following two strings :
Mon, 29 Oct 2012 13:07:07 GMT
2012-10-29 12:57:08
I wish there could be any date parsing lib available in python which does parse the above two strings to something like this:
2012-10-29 12:57:08
So that I can compare them. Note that the comparison should be able to produce the result like integer comparison. Like 1 is less than 2, so the same way 2012-10-29 12:57:08 is less than 2012-10-29 13:57:08
Are there any easy to do so in python?
Thanks in advance.
Use the dateutil module for general date parsing:
>>> from dateutil.parser import parse
>>> parse('Mon, 29 Oct 2012 13:07:07 GMT')
datetime.datetime(2012, 10, 29, 13, 7, 7, tzinfo=tzutc())
>>> parse('2012-10-29 12:57:08')
datetime.datetime(2012, 10, 29, 12, 57, 8)
datetime.datetime objects can be compared in various ways.
If you know the exact format of each date string to be parsed, you can also do the parsing more explicitly using the datetime.datetime.strptime() method:
>>> import datetime
>>> datetime.datetime.strptime('Mon, 29 Oct 2012 13:07:07 GMT', '%a, %d %b %Y %H:%M:%S %Z')
datetime.datetime(2012, 10, 29, 13, 7, 7)
Note however that that method ignores timezones!
Yes, time.strptime can convert the text to date representations. From there you can use strftime to print it how you like.
>>> a = '2012-10-29 12:57:08'
>>> time.strptime(a, '%Y-%m-%d %H:%M:%S')
time.struct_time(tm_year=2012, tm_mon=10, tm_mday=29, tm_hour=12, tm_min=57, tm_sec=8, tm_wday=0, tm_yday=303, tm_isdst=-1)
>>> b = 'Mon, 29 Oct 2012 13:07:07 GMT'
>>> time.strptime(b, '%a, %d %b %Y %H:%M:%S %Z')
time.struct_time(tm_year=2012, tm_mon=10, tm_mday=29, tm_hour=13, tm_min=7, tm_sec=7, tm_wday=0, tm_yday=303, tm_isdst=0)
The datetime module in python, with its strptime function (string parse), can do that.
For example, you can use the function like this:
somestring = '2004-03-13T03:00:00Z'
result = datetime.datetime.strptime(somestring, '%Y-%m-%dT%H:%M:%SZ')
Docs here.

Categories