If the current date is 2022-02-10, what value is returned by the function that follows?

PrestoDB supports ANSI SQL and includes support for several SQL dialects, so it’s straightforward to convert a date string to date format and vice-versa in various formats. Below we’ll discuss how to handle Presto date functions.

Show

If you have ISO 8601 format dates or timestamps like “2020-09-16 14:27:00” it’s very straightforward – use the date() function. Let’s test a Presto insert:

presto:default> create table datetest1 (s1 varchar);
CREATE TABLE
presto:default> insert into datetest1 values ('2020-09-16');
INSERT: 1 row
 
presto:default> select date(s1) as myDate from datetest1;
   myDate   
------------
 2020-09-16 

An alternative is to use the Presto cast(x as date) – it’s exactly the same:

presto:default> select CAST(s1 AS date) as myDate from datetest1;
   myDate   
------------
 2020-09-16 

Another alternative is to use the from_iso8601_date() function:

presto:default> select from_iso8601_date(s1) as myDate from datetest1;
   myDate   
------------
 2020-09-16 

>> Looking for an easy way to get up and running with Presto? Take a look at Ahana Cloud. <<

Ok but what if my dates are not ISO 8601? Like “16/09/2020” which is common in Europe and APAC? Let’s set-up some string-based test data again:

presto:default> create table datetest2 (s1 varchar);
CREATE TABLE
presto:default> insert into datetest2 values ('16/09/2020');
INSERT: 1 row

Did you know PrestoDB supports MySQL dialect?  Let’s convert our string to a timestamp using the MySQL date_parse() function, which returns a timestamp type:

presto:default> select date_parse(s1, '%d/%c/%Y') as myTimestamp from datetest2;
       myTimestamp       
-------------------------
 2020-09-16 00:00:00.000 

That works. And if we want that as a date instead of a timestamp, no problem just cast it:

presto:default> select cast(date_parse(s1, '%d/%c/%Y') as date) as myDate from datetest2;
   myDate   
------------
 2020-09-16 

Date_parse() is powerful:  For example you can use %c for non zero-padded month numbers, %e for non zero-padded days of the month, and it can handle two or four digit years. If your separators are “.” instead of “/” it can handle that. And if you have timestamps with “AM” or “PM” present then its ‘%p’ specifier can handle that too. 

So that’s how you convert date string to date format! 

If you’re looking for a more comprehensive dive into operating Presto, download our free ebook: Learning and Operating Presto

Want more Presto tips & tricks in your inbox? Sign up for our Presto community newsletter.

Common Questions/Errors:

Why am I getting the following error: ‘>’ cannot be applied to date, varchar (10)

Answer: You are trying to compare a string literal in your query to a date type in your schema. The operator in the error can be any operator >,=,<,>=,<=. To fix that, you need to cast the string to a date type or use a function to parse the string to date.

Example error: select now() as time_now where current_date = '2021-06-01'

Example solution:

Option 1: Cast 
select now() as time_now where current_date > date '2021-06-01'

Option 2: Cast Explicit
select now() as time_now where current_date > Cast ( '2021-06-01' as Date)

Option 3: Parse iso8601 date
select now() as time_now where current_date > from_iso8601_date('2021-06-01')

Option 4: MySQL parser, Non Standard Date format using date_parse 
select now() as time_now where current_date > date_parse('01-06-2021','%d-%m-%Y')

Option 5: Java DataTime for parser, Non Standard Date format using date_parse 
select now() as time_now where current_date > parse_datetime('01-06-2021','dd-MM-YYYY')

How do I convert string with timestamp to a date?

Answer: You are trying to accurately convert a string of the format such as ‘2021-05-13T19:02:57.415006+01:00’ to date and use it in your query for comparison. You need to parse the string using either date_parse or parse_datetime

Example problem: Need to convert the following timestamp to date: ‘2021-05-13T19:02:57.415006+01:00’

Example solution:

Option 1: MySQL parser, Non Standard Date format using 
select date_parse('2021-05-13T19:02:57.415006','%Y-%m-%dT%h:%i:%s.%f') AT TIME ZONE '+01:00'

Option 2: Java DateTime format parser, Non Standard Date format using 
select parse_datetime('2021-05-13T19:02:57.415006+01:00','YYYY-MM-dd''T''HH:mm:ss.SSSSSSZ') 

Want more Presto tips & tricks? Sign up for our Presto community newsletter.

datetime is the standard module for working with dates in python. It provides 4 main objects for date and time operations: datetime, date, time and timedelta. In this post you will learn how to do all sorts of operations with these objects and solve date-time related practice problems (easy to hard) in Python.

If the current date is 2022-02-10, what value is returned by the function that follows?
datetime in Python – Simplified Guide with Clear Examples. Photo by Sergio.

Content

  1. Introduction to datetime
  2. How to get the current date and the time in Python
  3. How to create the datetime object
  4. How to parse a string to datetime in python?
  5. How to format the datetime object into any date format?
  6. Useful datetime functions
  7. When and how to use the datetime.time() class?
  8. When and how to use the datetime.timedelta() class?
  9. Timezones
  10. 14 Practice Exercises with Solutions

1. Introduction to datetime

The datetime is the main module for working with dates in python. Whenever you need to work with dates in python, datetime module provides the necessary tools. datetime is part of python’s standard library, which means, you don’t need to install it separately. You can simply import as is.

import datetime

If you have to learn only one thing about handling dates in datetime module, it is the datetime.datetime() class. Inside datetime module, the most important and the commonly used object is the datetime class. Notice, I am talking about the datetime class inside the datetime module. Since both the module and the class have the same name, pay attention to what object you are using. Alright, besides the datetime.datetime class, there is also the:

  • date class
  • time class
  • timedelta class

Each these classes have its own purpose. We’ll cover all of these in this post and about a more advanced parser (not in `datetime`) to help parse any date.

2. How to get the current date and the time in Python

The datetime.datetime.now() method gives the current datetime.

datetime.datetime.now()
#> datetime.datetime(2019, 2, 15, 18, 54, 58, 291224)

The output is a nice datetime.datetime object with the current date and time in local time zone. The output is in the following order: ‘year’, ‘month’, ‘date’, ‘hour’, ‘minute’, ‘seconds’, ‘microseconds’. To get the date alone, use the datetime.date.today() instead.

datetime.date.today()
#> datetime.date(2019, 2, 15)

It returns a datetime.date object and not datetime.datetime. Why? That’s because, today() is a method of the datetime.date class and does not contain time information. Good. But the above notation hard to read. Printing it out will show in a nice YYYY-mm-dd format.

print(datetime.date.today())
#> 2019-02-15

We will see how to format datetime to many more formats shortly.

3. How to create the datetime object

We saw how to create the datetime object for current time. But how to create one for any given date and time? Say, for the following time: 2001-01-31::10:51:00 You can pass it in the same order to datetime.datetime(). (I will show an easier method in next section)

datetime.datetime(2001, 1, 31, 10, 51, 0)
#> datetime.datetime(2001, 1, 31, 10, 51)

You can also create a datetime from a unixtimestamp. A unixtimestamp is nothing but the number of seconds since the epoch date: ‘Jan 01, 1970’

mydatetime = datetime.datetime.fromtimestamp(528756281)
mydatetime
#> datetime.datetime(1986, 10, 4, 2, 14, 41)

You can convert the datetime back to a unixtimestamp as follows:

mydatetime.timestamp()
#> 528756281.0

4. How to parse a string to datetime in python?

The above method requires you to manually key in the year, month etc to create a datetime object. But, it not convenient when working with datasets or spreadsheet columns containing date strings. We need way to automatically parse a given date string, in whatever format, to a datetime object. Why is this needed? Because, datasets containing dates are often imported as strings. Secondly, the date can be in any arbitrary date string format, like, ‘2010 Jan 31’ or ‘January 31, 2010′ or even ’31-01-2010’. So, How to convert a date string to a `datetime`? The parser module from dateutil let’s you parse pretty much any date string to a datetime object.

from dateutil.parser import parse
parse('January 31, 2010')
#> datetime.datetime(2010, 1, 31, 0, 0)

Get Free Complete Python Course

Facing the same situation like everyone else?

Build your data science career with a globally recognised, industry-approved qualification. Get the mindset, the confidence and the skills that make Data Scientist so valuable.

If the current date is 2022-02-10, what value is returned by the function that follows?

Get Free Complete Python Course

Build your data science career with a globally recognised, industry-approved qualification. Get the mindset, the confidence and the skills that make Data Scientist so valuable.

5. Example 1 – Parsing a date string to datetime

Parse the following date string to a datetime object: ’31, March 31, 2010, 10:51pm’ Solution:

from dateutil.parser import parse
parse('31, March 31, 2010, 10:51pm')

You can convert any datetime object to nearly any representation of date format using its strftime() method.

6. How to format the datetime object into any date format?

You can convert any datetime object to nearly any representation of date format using its strftime() method. You need to pass the right symbol representaion of the date format as an argument.

dt = datetime.datetime(2001, 1, 31, 10, 51, 0)

print(dt.strftime('%Y-%m-%d::%H-%M'))
#> 2001-01-31::10-51

7. Example 2 – Formatting a datetime object

Parse the following datetime object to the following representation: ’31 January, 2001, Wednesday’

# Input
dt = datetime.datetime(2001, 1, 31)

Show Solution

Solution:

dt.strftime('%d %B, %Y, %A')

8. Useful datetime functions

The datetime object contains a number of useful date-time related methods.

# create a datatime obj
dt = datetime.datetime(2019, 2, 15)

# 1. Get the current day of the month
dt.day #> 31

# 2. Get the current day of the week
dt.isoweekday() #> 5 --> Friday

# 3. Get the current month of the year 
dt.month  #> 2 --> February

# 4. Get the Year
dt.year  #> 2019

9. When and how to use the datetime.time() class?

The datetime.time() is used to represnt the time component alone, without the date. The defualt output format is: hours, minutes, seconds and microseconds.

# hours, minutues, seconds, microseconds
tm = datetime.time(10,40,10,102301)
tm
#> datetime.time(10, 40, 10, 102301)

10. When and how to use the datetime.timedelta() class?

‘TimeDeltas’ represent a period of time that a particular time instance. You can think of them simply as the difference between two dates or times. It is normally used to add or remove a certain duration of time from datetime objects. To create a datetime.timedelta class you need to pass a specified duration to the class constructor. The arguments can be in weeks,days (default), hours, minutes, seconds, microseconds.

td = datetime.timedelta(days=30)
td

Now I have a `timedelta` object that represents a duration of 30 days. Let’s compute the date will be 30 days from now.

print(datetime.date.today() + td)
#> 2019-03-17

Likewise, you can subtract timedeltas as well. Another convenience with timedeltas is you can create arbitrary combination of time durations represented with days, weeks, hours etc. It will simplify that combination

td = datetime.timedelta(weeks=1, days=30, hours=2, minutes=40)
td 
#> datetime.timedelta(days=37, seconds=9600)

If you subtract two datetime objects you will get a timedelta object that represent the duration.

dt1 = datetime.datetime(2002, 1, 31, 10, 10, 0)
dt2 = datetime.datetime(2001, 1, 31, 10, 10, 0)
dt1 - dt2
#> datetime.timedelta(days=365)

Likewise, you can subtract two time deltas to get another timedelta object.

td1 = datetime.timedelta(days=30)  # 30 days
td2 = datetime.timedelta(weeks=1)  # 1 week
td1 - td2
#> datetime.timedelta(days=23)

11. How to work with timezones?

For time zones, python recommends pytz module which is not a standard built-in library. You need to install it separately (enter `pip install pytz` in terminal or command prompt) So how to set time zone to a particular datetime? Simply pass the respective pytz timezone object to tzinfo parameter when you create the datetime. Then, that datetime will become timezone aware. Let’s create a datetime object that belongs to UTC timezone.

import pytz
datetime.datetime(2001, 1, 31, 10, 10, 0, tzinfo=pytz.UTC)

UTC was a direct attribute of the pytz module. So, how to set to a different timezone? Lookup pytz.all_timezones for your timezone of choice. Then use the pytz.timezone() to create the respective timezone object that will be passed to the tzinfo argument.

# See available time zones
pytz.all_timezones[:5]
#> ['Africa/Abidjan',
#>  'Africa/Accra',
#>  'Africa/Addis_Ababa',
#>  'Africa/Algiers',
#>  'Africa/Asmara']
# Set to particular timezone
dt_in = datetime.datetime(2001, 1, 31, 3, 30, 0, 0, tzinfo=pytz.timezone('Asia/Tokyo'))
dt_in
#> datetime.datetime(2001, 1, 31, 3, 30, tzinfo=)

You can know that by converting to respective target timezone.

tgt_timezone = pytz.timezone('Africa/Addis_Ababa')
dt_in.astimezone(tgt_timezone)

12. Practice Examples

Rules for the challenges:

  1. No looking at the calendar
  2. Solve the problems with python code even if it is possible to compute it mentally

Exercise 1: How to parse date strings to datetime format?

Parse the following date strings to datetime format (easy)

# Input
s1 = "2010 Jan 1"
s2 = '31-1-2000' 
s3 = 'October10, 1996, 10:40pm'

# Deisred Output
#> 2010-01-01 00:00:00
#> 2000-01-31 00:00:00
#> 2019-10-10 22:40:00

Show Solution

# Input
s1 = "2010 Jan 1"
s2 = '31-1-2000' 
s3 = 'October10,1996, 10:40pm'

# Solution
from dateutil.parser import parse
print(parse(s1))
print(parse(s2))
print(parse(s3))
2010-01-01 00:00:00
2000-01-31 00:00:00
2019-10-10 22:40:00

Exercise 2: How many days has it been since you were born?

How many days has it been since you were born? (easy)

# Input
bday = 'Oct 2, 1869'  # use bday

Show Solution

# Input
bday = 'Oct 2, 1869'

import datetime
from dateutil.parser import parse

# Solution
td = datetime.datetime.now() - parse(bday)
td.days
54558

Exercise 3: How to count the number of saturdays between two dates?

Count the number of saturdays between two dates (medium)

# Input
import datetime
d1 = datetime.date(1869, 1, 2)
d2 = datetime.date(1869, 10, 2)

# Desired Output
#> 40

Show Solution

# Input
import datetime
d1 = datetime.date(1869, 1, 2)
d2 = datetime.date(1869, 10, 2)

# Solution
delta = d2 - d1  # timedelta

# Get all dates 
dates_btw_d1d2 = [(d1 + datetime.timedelta(i)) for i in range(delta.days + 1)]

n_saturdays = 0
for d in dates_btw_d1d2:
    n_saturdays += int(d.isoweekday() == 6)

print(n_saturdays)    
40

Exercise 4: How many days is it until your next birthday this year?

How many days is it until your next birthday this year? (easy)

# Input
bday = 'Oct 2, 1869'  # use b'day

Show Solution

# Input
bday = 'Oct 2, 1869'  # Enter birthday here

import datetime
from dateutil.parser import parse

# Solution
bdate = parse(bday)
current_bdate = datetime.date(year=datetime.date.today().year, month=bdate.month, day=bdate.day) 
td = current_bdate - datetime.date.today()
td.days
228

Exercise 5: How to count the number of days between successive days in an irregular sequence?

Count the number of days between successive days in the following list. (medium)

# Input
['Oct, 2, 1869', 'Oct, 10, 1869', 'Oct, 15, 1869', 'Oct, 20, 1869', 'Oct, 23, 1869']

# Desired Output
#> [8, 5, 5, 3]

Show Solution

# Input
datestrings = ['Oct, 2, 1869', 'Oct, 10, 1869', 'Oct, 15, 1869', 'Oct, 20, 1869', 'Oct, 23, 1869']

# Solution
import datetime
from dateutil.parser import parse
import numpy as np

dates = [parse(d) for d in datestrings]

print([d.days for d in np.diff(dates)])
[8, 5, 5, 3]

Exercise 6: How to convert number of days to seconds?

Convert the number of days till your next birthday to seconds (easy)

# Input
import datetime
bdate = datetime.date(1869, 10, 2)
td = datetime.date.today() - bdate

Show Solution

# Input
import datetime
bdate = datetime.date(1869, 10, 2)
td = datetime.date.today() - bdate

# Solution
td.total_seconds()
4713811200.0

Exercise 7: How to convert a given date to a datetime set at the beginning of the day?

Convert a given date to a datetime set at the beginning of the day (easy)

# Input
import datetime
date = datetime.date(1869, 10, 2)

# Desired Output
#> 1869-10-02 00:00:00

Show Solution

from datetime import date, datetime
d = date(1869, 10, 2)
print(datetime.combine(d, datetime.min.time()))
#> 1869-10-02 00:00:00
1869-10-02 00:00:00

Exercise 8: How to get the last day of the month for any given date in python?

Get the last day of the month for the below given date in python (easy)

# Input
import datetime
dt = datetime.date(1952, 2, 12)

# Desired Output
#> 29

Show Solution

# Input
import datetime
dt = datetime.date(1952, 2, 12)

# Solution
import calendar
calendar.monthrange(dt.year,dt.month)[1]
29

Exercise 9: How many Sundays does the month of February 1948 have?

Count the Sundays does the month of February 1948 have? (medium) Show Solution

import datetime
from calendar import monthrange

d1 = datetime.date(1948, 2, 1)
n_days = monthrange(1948, 2)

# Get all dates 
dates_btw_d1d2 = [(d1 + datetime.timedelta(i)) for i in range(n_days[1])]

n_sundays = 0
for d in dates_btw_d1d2:
    n_sundays += int(d.isoweekday() == 6)

print(n_sundays)    #> 4
4

Exercise 10: How to format a given date to “mmm-dd, YYYY” fortmat?

Format a given date to “mmm-dd, YYYY” fortmat? (easy)

# input
import datetime
d1 = datetime.date('2010-09-28')

# Desired output
#> 'Sep-28, 2010'

Show Solution

# Input
import datetime
d1 = datetime.date(2010, 9, 28)

# Solution
d1.strftime('%b-%d, %Y')
'Sep-28, 2010'

Exercise 11: How to convert datetime to Year-Qtr format?

Convert the below datetime to Year-Qtr format? (easy)

# input
import datetime
d1 = datetime.datetime(2010, 9, 28, 10, 40, 59)

# Desired output
#> '2010-Q3'

Show Solution

# input
import datetime
d1 = datetime.datetime(2010, 9, 28, 10, 40, 59)

# Solution
f'{d1.year}-Q{d1.month//4 + 1}'
'2010-Q3'

Exercise 12: How to convert unix timestamp to a readable date?

Convert the below unix timestamp to a readable date (medium)

# Input
unixtimestamp = 528756281

# Desired Output
#> 04-October-1986

Show Solution

# Input
unixtimestamp = 528756281

# Solution
import datetime
dt = datetime.datetime.fromtimestamp(528756281)
dt.strftime('%d-%B-%Y')
'04-October-1986'

Exercise 13: How to get the time in a different timezone?

If it is ‘2001-01-31::3:30:0’ in ‘Asia/Tokyo’. What time is it in ‘Asia/Kolkata’? (medium)

import datetime
dt_in = datetime.datetime(2001, 1, 31, 3, 30, 0, 0, tzinfo=pytz.timezone('Asia/Tokyo'))

# Desired Solution
#> datetime.datetime(2001, 1, 30, 23, 41, tzinfo=)

Show Solution

import datetime
dt_in = datetime.datetime(2001, 1, 31, 3, 30, 0, 0, tzinfo=pytz.timezone('Asia/Tokyo'))

# Solution
india_tz = pytz.timezone('Asia/Kolkata')
dt_in.astimezone(india_tz)
datetime.datetime(2001, 1, 30, 23, 41, tzinfo=)

Exercise 14: How to fill up missing dates in a given irregular sequence of dates?

Fill up missing dates in a given irregular sequence of dates? (hard)

# Input
['Oct 2, 1869', 'Oct 5, 1869', 'Oct 7, 1869', 'Oct 9, 1869']

# Desired Output
#> ['Oct 02, 1869', 'Oct 03, 1869', 'Oct 04, 1869', 'Oct 05, 1869', 
#> 'Oct 06, 1869', 'Oct 07, 1869', 'Oct 08, 1869', 'Oct 09, 1869']

Show Solution

# Input
datestrings = ['Oct 2, 1869', 'Oct 5, 1869', 'Oct 7, 1869', 'Oct 9, 1869']

# Solution
import datetime
from dateutil.parser import parse
import numpy as np

dates = [parse(d) for d in datestrings]

d1 = np.min(dates)
d2 = np.max(dates)

delta = d2 - d1  # timedelta

# Get all dates 
dates_btw_d1d2 = [(d1 + datetime.timedelta(i)).strftime('%b %d, %Y') for i in range(delta.days + 1)]
print(dates_btw_d1d2)
['Oct 02, 1869', 'Oct 03, 1869', 'Oct 04, 1869', 'Oct 05, 1869', 'Oct 06, 1869', 'Oct 07, 1869', 'Oct 08, 1869', 'Oct 09, 1869']

10. Conclusion

How many were you able to solve? Congratulations if you were able to solve 7 or more. We covered nearly everything you will need to work with dates in python. Let me know if I have missed anything. Or if you have better answers or have more questions, please write in the comments area below. See you in the next one!  

What does new date () return?

Return value Calling the Date() function (without the new keyword) returns a string representation of the current date and time, exactly as new Date().toString() does.

What returns the current system date as a value?

Returns a Variant (Date) containing the current system date. To set the system date, use the Date statement.

How do you convert a date to a function?

How to get different date formats in SQL Server.
Use the SELECT statement with CONVERT function and date format option for the date values needed..
To get YYYY-MM-DD use this T-SQL syntax SELECT CONVERT(varchar, getdate(), 23).
To get MM/DD/YY use this T-SQL syntax SELECT CONVERT(varchar, getdate(), 1).

Which function returns the date part of the date expression?

Table 12.11 Date and Time Functions.