---
# System prepended metadata

title: Python - datetime module
tags: [Python]

---

## Datetime Module

Commonly used datetime classes:
- datetime.datetime: Date and time
- datetime.date: Date
- datetime.time: Time
- datetime.timedelta: Time difference or elapsed time


```python
import datetime # from datetime import datetime/date/time/timedelta
```

### 01. `datetime` object

#### get current date and time


```python
dt_now = datetime.datetime.now()
print(dt_now)
```

    2023-06-23 00:58:12.989854
    


```python
print(type(dt_now))
```

    <class 'datetime.datetime'>
    

#### some attribute


```python
print(dt_now.year)
print(dt_now.month)
print(dt_now.day)
```

    2023
    6
    23
    

#### create `datetime` object


```python
dt = datetime.datetime(2023, 6, 22, 12, 34, 56)
print(dt)
```

    2023-06-22 12:34:56
    


```python
dt = datetime.datetime(2023, 6, 22)
print(dt)
```

    2023-06-22 00:00:00
    

#### create `date` and `time` objects from `datetime` object


```python
dt = datetime.datetime(2023, 6, 22, 12, 34, 56)
d = dt.date()
print(d)
```

    2023-06-22
    


```python
t = dt.time()
print(t)
```

    12:34:56
    

#### create `datetime` object from `date` and `time` objects
- use `datetime.combine()`


```python
print(d)
```

    2023-06-22
    


```python
print(t)
```

    12:34:56
    


```python
print(datetime.datetime.combine(d, t))
```

    2023-06-22 12:34:56
    

### 02. `date` object

#### get today's date


```python
today = datetime.date.today()
print(today)
```

    2023-06-23
    


```python
print(type(today))
```

    <class 'datetime.date'>
    

#### some attributes


```python
print(today.year)
print(today.month)
print(today.day)
```

    2023
    6
    23
    

#### create a `date` object


```python
d = datetime.date(2023, 6, 22)
print(d)
```

    2023-06-22
    

### 03. `time` object

#### get today's date: 
As of Python 3.11, there is no direct method for creating a time object representing the current time. You can use `datetime.now()` to create a datetime object for the current date and time, and then convert it to a time object with the `time()` method.


```python
time = datetime.datetime.now().time()
print(time)
```

    00:58:13.211853
    


```python
print(type(time))
```

    <class 'datetime.time'>
    

#### some attributes


```python
print(time.microsecond)
print(time.second)
print(time.minute)
print(time.hour)
```

    211853
    13
    58
    0
    

#### create a `time` object


```python
print(datetime.time(20, 15, 30, 2000))
```

    20:15:30.002000
    

### 04. `timedelta` object

#### generate `timedelta` object by subtracting `datetime` and `date` objects


```python
dt1 = datetime.datetime(2023, 4, 1, 20, 15, 30, 2000)
dt2 = datetime.datetime(2023, 7, 1, 10, 45, 15, 100)

td = dt2 - dt1
print(td)
# 90 days, 14:29:44.998100

print(type(td))
# <class 'datetime.timedelta'>

print(td.days)
# 90

print(td.seconds)
# 52184

print(td.microseconds)
# 998100

print(td.total_seconds())
# 7828184.9981
```

    90 days, 14:29:44.998100
    <class 'datetime.timedelta'>
    90
    52184
    998100
    7828184.9981
    

#### arithmetic with `timedelta` objects


```python
dt = datetime.datetime(2023, 4, 1, 20, 15, 30, 2000)
print(dt)
# 2023-04-01 20:15:30.002000

print(dt - datetime.timedelta(weeks=1))
# 2023-03-25 20:15:30.002000

print(dt + datetime.timedelta(days=10))
# 2023-04-11 20:15:30.002000

print(dt + datetime.timedelta(minutes=50))
# 2023-04-01 21:05:30.002000

# calculate date interval:
d_target = datetime.date(2023, 5, 1)
td = d_target - dt.date()
print(td)
```

    2023-04-01 20:15:30.002000
    2023-03-25 20:15:30.002000
    2023-04-11 20:15:30.002000
    2023-04-01 21:05:30.002000
    30 days, 0:00:00
    

### 05. `strftime()`
- convert date and time to a string
- here are the format codes commonly used:
```
%d: Day of the month as a zero-padded decimal number
%m: Month as a zero-padded decimal number
%y: Year without century as a zero-padded decimal number
%Y: Year with century as a decimal number
%H: Hour (24-hour clock) as a zero-padded decimal number
%I: Hour (12-hour clock) as a zero-padded decimal number
%M: Minute as a zero-padded decimal number
%S: Second as a zero-padded decimal number
%f: Microsecond as a decimal number, zero-padded to 6 digits
%A: Weekday as locale’s full name
%a: Weekday as locale’s abbreviated name
%B: Month as locale’s full name
%b: Month as locale’s abbreviated name
%j: Day of the year as a zero-padded decimal number
%U: Week number of the year (Sunday as the first day of the week) as a zero-padded decimal number
%W: Week number of the year (Monday as the first day of the week) as a zero-padded decimal number


```


```python
dt = datetime.datetime(2023, 5, 30, 20, 15, 30, 2000)
print(dt.strftime('%Y/%m/%d %H:%M:%S.%f'))
```

    2023/05/30 20:15:30.002000
    


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

    Tuesday, May 30, 2023
    


```python
d = dt.date()
print(d.strftime('%Y/%m/%d %H:%M:%S.%f'))
```

    2023/05/30 00:00:00.000000
    


```python
t = dt.time()
print(t.strftime('%Y/%m/%d %H:%M:%S.%f'))
```

    1900/01/01 20:15:30.002000
    

### 06. `strptime()`
- string parsed time
- convert strings to date and time


```python
s = '2023/6/12 20:30'
s_format = '%Y/%m/%d %H:%M'
dt = datetime.datetime.strptime(s, s_format)
print(dt)
```

    2023-06-12 20:30:00
    

#### convert to another string by using `strftime()`


```python
print(dt)
new_dt = dt.strftime("%Y%m%d_%H%M%S")
print(new_dt)
```

    2023-06-12 20:30:00
    20230612_203000
    

### 07. ISO 8601 format of time:
- convert datetime to isoformat: `isoformat()`
- convert isoformat string to datetime: `fromisoformat()`


```python
dt = datetime.datetime.now()
print(type(dt))
```

    <class 'datetime.datetime'>
    


```python
print(dt.isoformat())
print(type(dt.isoformat()))
```

    2023-06-23T00:58:13.398855
    <class 'str'>
    


```python
iso_string = "2023-06-22T05:00:30.001000"
dt = datetime.datetime.fromisoformat(iso_string)
print(dt)
print(type(dt))
```

    2023-06-22 05:00:30.001000
    <class 'datetime.datetime'>
    

### 08. UNIX time:
```
Unix time is the number of seconds that have elapsed since the Unix epoch, 00:00:00 UTC (Coordinated Universal Time) on January 1, 1970. It is also known as Epoch time, Posix time, and so on.
```
- convert datetime to isoformat: `timestamp()`
- convert isoformat string to datetime: `fromtimestamp()`


```python
dt = datetime.datetime.now()
print(type(dt))


# how many seconds have been since 1970/01/01 09:00:00 until now
ts = dt.timestamp()
print(ts)
print(type(ts))
```

    <class 'datetime.datetime'>
    1687449493.447855
    <class 'float'>
    


```python
dt = datetime.datetime.fromtimestamp(0)
print(dt)
print(type(dt))
```

    1970-01-01 09:00:00
    <class 'datetime.datetime'>
    


```python
dt = datetime.datetime.fromtimestamp(ts)
print(dt)
```

    2023-06-23 00:58:13.447855
    

### 09. Case Study:

#### inuput: datetime str in ISO 8601 format; output: yesterday(in datetime format)


```python
def get_yesterday(x: str):
    
    d = datetime.datetime.fromisoformat(x)
    td = datetime.timedelta(days=1)
    return d - td
```


```python
print(get_yesterday("2022-01-02"))
```

    2022-01-01 00:00:00
    

#### inuput: datetime str in ISO 8601 format; output:ISO 8601 in %Y-%m-%d %H:%M:%S


```python
def isotime_convert(x: str):
    d = datetime.datetime.strptime(x, "%a %b %d %y %H:%M:%S")
    time_string = d.strftime("%Y-%m-%d %H:%M:%S")
    return time_string
```


```python
isotime_convert("Fri Dec 31 21 23:59:59")
```




    '2021-12-31 23:59:59'



