Get date and time when photo was taken from EXIF data using PIL

Found the answer eventually, the tag I needed was 36867:

from PIL import Image
def get_date_taken(path):
    return Image.open(path)._getexif()[36867]

I like to use exif-py because it's pure-python, does not require compilation/installation, and works with both python 2.x and 3.x making it ideal for bundling with small portable python applications.

Link: https://github.com/ianare/exif-py

Example to get the date and time a photo was taken:

import exifread
with open('image.jpg', 'rb') as fh:
    tags = exifread.process_file(fh, stop_tag="EXIF DateTimeOriginal")
    dateTaken = tags["EXIF DateTimeOriginal"]
    return dateTaken

ExifTags.TAGS is a mapping from tag to tag name. You can use it to create a map of tag names to values.

On this particular picture, there are a few different "date" properties (DateTime, DateTimeOriginal, DateTimeDigitized) that could be used.

import json
from PIL import Image, ExifTags
from datetime import datetime

def main(filename):
    image_exif = Image.open(filename)._getexif()
    if image_exif:
        # Make a map with tag names
        exif = { ExifTags.TAGS[k]: v for k, v in image_exif.items() if k in ExifTags.TAGS and type(v) is not bytes }
        print(json.dumps(exif, indent=4))
        # Grab the date
        date_obj = datetime.strptime(exif['DateTimeOriginal'], '%Y:%m:%d %H:%M:%S')
        print(date_obj)
    else:
        print('Unable to get date from exif for %s' % filename)

Output:

{
    "DateTimeOriginal": "2008:11:15 19:36:24",
    "DateTimeDigitized": "2008:11:15 19:36:24",
    "ColorSpace": 1,
    "ExifImageWidth": 3088,
    "SceneCaptureType": 0,
    "ExifImageHeight": 2320,
    "SubjectDistanceRange": 2,
    "ImageDescription": "               ",
    "Make": "Hewlett-Packard                ",
    "Model": "HP Photosmart R740             ",
    "Orientation": 1,
    "DateTime": "2008:11:15 19:36:24",
    ...
}
2008-11-15 19:36:24

This has changed slightly in more recent versions of Pillow (6.0+ I believe).

They added a public method getexif() that you should use. The previous version was private and experimental (_getexif()).

from PIL import Image

im = Image.open('path/to/image.jpg')
exif = im.getexif()
creation_time = exif.get(36867)