Dates
Date Difference
Compute the number of days between paired start and end dates. By hand,
parse each ISO string to a datetime.date and subtract to get a
timedelta; .days extracts the whole-day count. With pandas, subtract
two datetime64 Series to get a timedelta Series, then .dt.days gives
the integer day counts.
By hand
Iterate by index so each pair of start and end strings can be accessed
together. Parse both with datetime.date.fromisoformat, subtract to get
a timedelta, and append .days. Neither datetime.date nor timedelta
is a traced type — the trace shows i and result only.
import datetime
starts = ['2024-01-05', '2024-03-15', '2024-06-01', '2024-09-10']
ends = ['2024-01-19', '2024-03-22', '2024-06-30', '2024-10-08']
result = []
for i in range(len(starts)):
s = datetime.date.fromisoformat(starts[i])
e = datetime.date.fromisoformat(ends[i])
result.append((e - s).days)
print('RESULT:', result)
import datetime
1import datetime2starts = ['2024-01-05', '2024-03-15', '2024-06-01', '2024-09-10']starts ← ['2024-01-05', '2024-03-15', '2024-06-01', '2024-09-10']
1import datetime2starts = ['2024-01-05', '2024-03-15', '2024-06-01', '2024-09-10']3ends = ['2024-01-19', '2024-03-22', '2024-06-30', '2024-10-08']values this step['2024-01-05', '2024-03-15', '2024-06-01', '2024-09-10']startsends ← ['2024-01-19', '2024-03-22', '2024-06-30', '2024-10-08']
2starts = ['2024-01-05', '2024-03-15', '2024-06-01', '2024-09-10']3ends = ['2024-01-19', '2024-03-22', '2024-06-30', '2024-10-08']4result = []values this step['2024-01-19', '2024-03-22', '2024-06-30', '2024-10-08']endsresult ← []
3ends = ['2024-01-19', '2024-03-22', '2024-06-30', '2024-10-08']4result = []5for i in range(len(starts)):values this step[]resulti ← 0
4result = []5for i in range(len(starts)):6 s = datetime.date.fromisoformat(starts[i])values this step0is = datetime.date.fromisoformat(starts[i])
5for i in range(len(starts)):6 s = datetime.date.fromisoformat(starts[i])7 e = datetime.date.fromisoformat(ends[i])e = datetime.date.fromisoformat(ends[i])
6s = datetime.date.fromisoformat(starts[i])7e = datetime.date.fromisoformat(ends[i])8result.append((e - s).days)result ← [14]
7 e = datetime.date.fromisoformat(ends[i])8 result.append((e - s).days)9print('RESULT:', result)values this step[] → [14]resulti ← 1
4result = []5for i in range(len(starts)):6 s = datetime.date.fromisoformat(starts[i])values this step0 → 1is = datetime.date.fromisoformat(starts[i])
5for i in range(len(starts)):6 s = datetime.date.fromisoformat(starts[i])7 e = datetime.date.fromisoformat(ends[i])e = datetime.date.fromisoformat(ends[i])
6s = datetime.date.fromisoformat(starts[i])7e = datetime.date.fromisoformat(ends[i])8result.append((e - s).days)result ← [14, 7]
7 e = datetime.date.fromisoformat(ends[i])8 result.append((e - s).days)9print('RESULT:', result)values this step[14] → [14, 7]resulti ← 2
4result = []5for i in range(len(starts)):6 s = datetime.date.fromisoformat(starts[i])values this step1 → 2is = datetime.date.fromisoformat(starts[i])
5for i in range(len(starts)):6 s = datetime.date.fromisoformat(starts[i])7 e = datetime.date.fromisoformat(ends[i])e = datetime.date.fromisoformat(ends[i])
6s = datetime.date.fromisoformat(starts[i])7e = datetime.date.fromisoformat(ends[i])8result.append((e - s).days)result ← [14, 7, 29]
7 e = datetime.date.fromisoformat(ends[i])8 result.append((e - s).days)9print('RESULT:', result)values this step[14, 7] → [14, 7, 29]resulti ← 3
4result = []5for i in range(len(starts)):6 s = datetime.date.fromisoformat(starts[i])values this step2 → 3is = datetime.date.fromisoformat(starts[i])
5for i in range(len(starts)):6 s = datetime.date.fromisoformat(starts[i])7 e = datetime.date.fromisoformat(ends[i])e = datetime.date.fromisoformat(ends[i])
6s = datetime.date.fromisoformat(starts[i])7e = datetime.date.fromisoformat(ends[i])8result.append((e - s).days)result ← [14, 7, 29, 28]
7 e = datetime.date.fromisoformat(ends[i])8 result.append((e - s).days)9print('RESULT:', result)values this step[14, 7, 29] → [14, 7, 29, 28]resultfor i in range(len(starts)):
4result = []5for i in range(len(starts)):6 s = datetime.date.fromisoformat(starts[i])stdout ← RESULT: [14, 7, 29, 28]
8 result.append((e - s).days)9print('RESULT:', result)values this stepRESULT: [14, 7, 29, 28]stdout
With pandas
pd.to_datetime(df['end']) - pd.to_datetime(df['start']) subtracts the
two datetime64 columns, yielding a timedelta64 Series. .dt.days
extracts the integer day count. The result dtype is int64 — no NaN,
no float upcast.
import pandas as pd
from dalib.display import set_display
set_display()
starts = ['2024-01-05', '2024-03-15', '2024-06-01', '2024-09-10']
ends = ['2024-01-19', '2024-03-22', '2024-06-30', '2024-10-08']
df = pd.DataFrame({'start': starts, 'end': ends})
d = (pd.to_datetime(df['end']) - pd.to_datetime(df['start'])).dt.days
result = d.tolist()
print('index:', d.index.tolist())
print('dtype:', d.dtype)
print('values:', d.tolist())
print('RESULT:', result)
index: [0, 1, 2, 3]
dtype: int64
values: [14, 7, 29, 28]
RESULT: [14, 7, 29, 28]
Implementation notes
- ISO format (
YYYY-MM-DD) is used throughout to avoid locale-ambiguous parsing.pd.to_datetimehandles it unambiguously regardless of system locale; for non-ISO inputs useformat=explicitly. .dt.daysgives whole days only — the fractional-day part (from non-midnight timestamps) is discarded. Use.dt.total_seconds()and divide if sub-day precision matters.d.tolist()on anint64Series returns Pythonintvalues; naivetimedelta.daysis also a Pythonint— RESULT matches without any conversion.- Cross-reference:
diff-previous-row(python-pandas ch09) for the row-to-row lag pattern (each row vs the previous) vs the explicit paired subtraction here.