Convert different date strings to unix timestamp in python 3.6 - python

I have two strings. How can I convert them to UNIX timestamp (eg.: "1284101485")? (Please observe that 1284101485 is not the correct answer for this case.)
I don't care about time zones as long as it is consistent.
string_1_to_convert = 'Tue Jun 25 13:53:58 CEST 2019'
string_2_to_convert = '2019-06-25 13:53:58'

You can use dateparser
Install:
$ pip install dateparser
Sample code:
import dateparser
from time import mktime
string_1_to_convert = 'Tue Jun 25 13:53:58 CEST 2019'
string_2_to_convert = '2019-06-25 13:53:58'
datetime1 = dateparser.parse(string_1_to_convert)
datetime2 = dateparser.parse(string_2_to_convert)
unix_secs_1 = mktime(datetime1.timetuple())
unix_secs_2 = mktime(datetime2.timetuple())
print(unix_secs_1)
print(unix_secs_2)
Output:
1561492438.0
1561488838.0
The above implementation gives you a consistent response and doesn't give you an error when trying to parse CEST.

you can use .strptime to parse by a format you specify.
try this:
import datetime
string_1_to_convert = 'Tue Jun 25 13:53:58 CEST 2019'
string_2_to_convert = '2019-06-25 13:53:58'
ts1 = datetime.datetime.strptime(string_1_to_convert, "%a %b %d %H:%M:%S %Z %Y").timestamp()
ts2 = datetime.datetime.strptime(string_2_to_convert, "%Y-%m-%d %H:%M:%S").timestamp()
print(ts1)
print(ts2)
NOTICE: the CEST part might be non-portable, as strptime only knows how to parse timezones that appear in time.tzname.

Related

How to parse time retrieved from Facebook Graph into 12 hour format?

When I pull events start times from Facebook Graph in comes in this form:
2017-09-26T18:00:00+0300
I'd like to convert it into readable format so I use this:
readable_event_date = dateutil.parser.parse(event_date).strftime('%a, %b %d %Y %H:%M:%S')
and it comes out like this:
Tue, 26 Sep 2017 18:00:00
Which is good but it loses the offset from UTC and I'd like it in AM PM format.
Thus, I would like it like this:
Tue, 26 Sep 2017 9:00 PM
To get into 12 hours format and keep offset from UTC for printing :
from dateutil.parser import parse
event_date = '2017-09-26T18:00:0+0300'
date = parse(event_date)
offset = date.tzinfo._offset
readable_event_date = (date + offset).strftime('%a, %b %d %Y %I:%M:%S %p')
print(readable_event_date)
Output:
'Tue, Sep 26 2017 09:00:00 PM'
It seems like what you want is this time, expressed in UTC, in the format '%a, %b %d %Y %I:%M:%S %p'. Luckily, all the information you need to do this is contained in the datetime object that you parsed, you just need to convert to UTC
Python 2.6+ or Python 3.3+:
The approach you've taken using dateutil will work for Python 2.6+ or Python 3.3.+ (and also works for a greater variety of datetime string formats):
from dateutil.parser import parse
# In Python 2.7, you need to use another one
from dateutil.tz import tzutc
UTC = tzutc()
dt_str = '2017-09-26T18:00:00+0300'
dt = parse(dt_str)
dt_utc = dt.astimezone(UTC) # Convert to UTC
print(dt_utc.strftime('%a, %b %d %Y %I:%M:%S %p'))
# Tue, Sep 26 2017 03:00:00 PM
One thing I notice is that the date you've provided, as far as I can tell, represents 3PM in UTC, not 9PM (as your example states). This is one reason you should use .astimezone(UTC) rather than some other approach.
If you want to include the time zone offset information, you can also use the %z parameter on the non-converted version of the datetime object.
print(dt.strftime('%a, %b %d %Y %I:%M:%S%z %p'))
# Tue, Sep 26 2017 06:00:00+0300 PM
This %z parameter may also be useful even if you are keeping it in UTC, because then you can at least be clear that the date the user is seeing is a UTC date.
Python 3.2+ only:
Given that you know the exact format of the input string, in Python 3.2+, you can achieve this same thing without pulling in dateutil, and it will almost certainly be faster (which may or may not be a concern for you).In your case here is how to rewrite the code so that it works with just the standard library:
from datetime import datetime, timezone
UTC = timezone.utc
dt_str = '2017-09-26T18:00:00+0300'
dt = datetime.strptime(dt_str, '%Y-%m-%dT%H:%M:%S%z')
dt_utc = dt.astimezone(UTC)
print(dt_utc.strftime('%a, %b %d %Y %I:%M:%S %p'))
# Tue, Sep 26 2017 03:00:00 PM
print(dt.strftime('%a, %b %d %Y %I:%M:%S%z %p'))
# Tue, Sep 26 2017 06:00:00+0300 PM

ValueError time data doesn't match the format

I am trying to match time zones with empty string in strptime function. Howevr, I get the following error.
ValueError: time data 'Thu Apr 14 01:46:29 MDT 2016' does not match format '%a %b %d %H:%M:%S %Y'
This is the code I try.
import datetime
d = datetime.datetime.strptime('Thu Apr 14 01:46:29 MDT 2016', '%a %b %d %H:%M:%S %Y')
How to map time-zone in python?
time zone can be MDT, MST,etc.
To parse this specific format (similar to rfc 822 used in emails), you could use email packages:
from email.utils import parsedate_tz, mktime_tz
time_tuple = parsedate_tz('Thu Apr 14 01:46:29 MDT 2016')
posix_time = mktime_tz(time_tuple)
Note: MDT is -6 hours here (according to the rfc 822). In general, timezone abbreviations may be ambiguous.
On Python 3.3+, you could create a timezone-aware datetime directly:
from email.utils import parsedate_to_datetime
dt = parsedate_to_datetime('Thu Apr 14 01:46:29 MDT 2016')
Here's how to parse it on earlier Python versions.

Strptime - text format contains written month names

Is it possible to use strptime with text like this: Wed 29th Jul 13:02:30. The point is that I want to have proper format to compare dates.
So I'm looking for something like:
datetime.strptime(' '.join(date.split(' ')[1:]), "%d-%m-%h:%m:%s")
Is it possible? If not, what is the best option how to do that?
Get rid of the "th", "st" and "nd" on the date.
Then use:
datetime.strptime("Wed 29 Jul 13:02:30", "%a %d %b %H:%M:%S")
Use re to remove any rd, nd, st, and th then parse normally:
s = "Wed 29th Jul 13:02:30"
from datetime import datetime
import re
dte = datetime.strptime(re.sub("rd|nd|st|th","",s), "%a %d %b %H:%M:%S")
You could also use dateutil to do the work for you :
s= "Wed 29th Jul 13:02:30"
from dateutil import parser
print(parser.parse(s))

Python Date / Time Regular Expression

I am pretty new to regular expressions and it's pretty alien to me. I am parsing an XML feed which produces a date time as follows:
Wed, 23 July 2014 19:25:52 GMT
But I want to split these up so there are as follows:
date = 23/07/2014
time = 19/25/52
Where would I start? I have looked at a couple of other questions on SO and all of them deviate a bit from what I am trying to achieve.
Use datetime.strptime to parse the date from string and then format it using the strftime method of datetime objects:
>>> from datetime import datetime
>>> dt = datetime.strptime("Wed, 23 July 2014 19:25:52 GMT", "%a, %d %B %Y %H:%M:%S %Z")
>>> dt.strftime('%d/%m/%Y')
'23/07/2014'
>>> dt.strftime('%H/%M/%S')
'19/25/52'
But if you're okay with the ISO format you can call date and time methods:
>>> str(dt.date())
'2014-07-23'
>>> str(dt.time())
'19:25:52'

Twitter created_at convert epoch time in python

I have this date from Twitter:
created_at = "Wed Aug 29 17:12:58 +0000 2012"
I want to convert it to a time using something like:
time.mktime(created_at)
But I get this error:
TypeError: argument must be 9-item sequence, not str
What am I doing wrong?
You need to convert the incoming string to a Python time tuple using strptime before you can do anything with it.
This code will take the input string, convert it to a tuple and then converts that to a Unix-epoch time float using time.mktime:
import time
created_at = "Wed Aug 29 17:12:58 +0000 2012"
print time.mktime(time.strptime(created_at,"%a %b %d %H:%M:%S +0000 %Y"))
I don't if it too late, use arrow package instead could fewer imports and a lot less code.
pip install arrow
Then:
>>> arrow.Arrow.strptime("Wed Aug 29 17:12:58 +0000 2012", "%a %b %d %H:%M:%S %z %Y")
<Arrow [2012-08-29T17:00:58+00:00]>
>>> arrow.Arrow.strptime("Wed Aug 29 17:12:58 +0000 2012", "%a %b %d %H:%M:%S %z %Y").timestamp
1346259658
Read the documentation of time.mktime
It requires struct_time, or you can alternatively represent it using a 9-tuple.
The required entries are:
Year
Month
Date
Hour
Minute
Second
Day in week
Day in year
Daylight Savings Time
This is not the function you need, however. It seems that you want to use strptime instead.
According to the documentation:
Parse a string representing a time according to a format.
The return value is a struct_time as returned by gmtime() or localtime().
>>> import time
>>> time.strptime("30 Nov 00", "%d %b %y")
time.struct_time(tm_year=2000, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0,
tm_sec=0, tm_wday=3, tm_yday=335, tm_isdst=-1)
So, you can do:
time.strptime(created_at)

Categories