Here's a summary of common Python time conversions
Some methods drop fractions of seconds, and are marked with (s). An explicit formula such as ts = (d - epoch) / unit can be used instead (thanks jfs).
- struct_time (UTC) → POSIX (s):
 calendar.timegm(struct_time)
- Naïve datetime (local) → POSIX (s):
 calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
 (exception during DST transitions, see comment from jfs)
- Naïve datetime (UTC) → POSIX (s):
 calendar.timegm(dt.utctimetuple())
- Aware datetime → POSIX (s):
 calendar.timegm(dt.utctimetuple())
- POSIX → struct_time (UTC, s):
 time.gmtime(t)
 (see comment from jfs)
- Naïve datetime (local) → struct_time (UTC, s):
 stz.localize(dt, is_dst=None).utctimetuple()
 (exception during DST transitions, see comment from jfs)
- Naïve datetime (UTC) → struct_time (UTC, s):
 dt.utctimetuple()
- Aware datetime → struct_time (UTC, s):
 dt.utctimetuple()\
- POSIX → Naïve datetime (local):
datetime.fromtimestamp(t, None)
 (may fail in certain conditions, see comment from jfs below)
- struct_time (UTC) → Naïve datetime (local, s):
 datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
 (can't represent leap seconds, see comment from jfs)
- Naïve datetime (UTC) → Naïve datetime (local):
 dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
- Aware datetime → Naïve datetime (local):
 dt.astimezone(tz).replace(tzinfo=None)
- POSIX → Naïve datetime (UTC):
 datetime.utcfromtimestamp(t)
- struct_time (UTC) → Naïve datetime (UTC, s):
 datetime.datetime(*struct_time[:6])(can't represent leap seconds, see comment from jfs)
- Naïve datetime (local) → Naïve datetime (UTC):
 stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
 (exception during DST transitions, see comment from jfs)
- Aware datetime → Naïve datetime (UTC):
 dt.astimezone(UTC).replace(tzinfo=None)
- POSIX → Aware datetime:
 datetime.fromtimestamp(t, tz)
 (may fail for non-pytz timezones)
- struct_time (UTC) → Aware datetime (s):
 datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
 (can't represent leap seconds, see comment from jfs)
- Naïve datetime (local) → Aware datetime:
 stz.localize(dt, is_dst=None)
 (exception during DST transitions, see comment from jfs)
- Naïve datetime (UTC) → Aware datetime:
 dt.replace(tzinfo=UTC)
If you already have a datetime object my_dt you can change it to UTC with:
datetime.datetime.utcfromtimestamp(my_dt.timestamp())