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.

naive.py
Replay: real traced execution (multi-file project)
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)
  1. import datetime

    1import datetime2starts = ['2024-01-05', '2024-03-15', '2024-06-01', '2024-09-10']
  2. 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']starts
  3. ends ← ['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']ends
  4. result ← []

    3ends   = ['2024-01-19', '2024-03-22', '2024-06-30', '2024-10-08']4result = []5for i in range(len(starts)):
    values this step[]result
  5. i ← 0

    4result = []5for i in range(len(starts)):6    s = datetime.date.fromisoformat(starts[i])
    values this step0i
  6. s = 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])
  7. e = datetime.date.fromisoformat(ends[i])

    6s = datetime.date.fromisoformat(starts[i])7e = datetime.date.fromisoformat(ends[i])8result.append((e - s).days)
  8. result ← [14]

    7    e = datetime.date.fromisoformat(ends[i])8    result.append((e - s).days)9print('RESULT:', result)
    values this step[] [14]result
  9. i ← 1

    4result = []5for i in range(len(starts)):6    s = datetime.date.fromisoformat(starts[i])
    values this step0 1i
  10. s = 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])
  11. e = datetime.date.fromisoformat(ends[i])

    6s = datetime.date.fromisoformat(starts[i])7e = datetime.date.fromisoformat(ends[i])8result.append((e - s).days)
  12. 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]result
  13. i ← 2

    4result = []5for i in range(len(starts)):6    s = datetime.date.fromisoformat(starts[i])
    values this step1 2i
  14. s = 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])
  15. e = datetime.date.fromisoformat(ends[i])

    6s = datetime.date.fromisoformat(starts[i])7e = datetime.date.fromisoformat(ends[i])8result.append((e - s).days)
  16. 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]result
  17. i ← 3

    4result = []5for i in range(len(starts)):6    s = datetime.date.fromisoformat(starts[i])
    values this step2 3i
  18. s = 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])
  19. e = datetime.date.fromisoformat(ends[i])

    6s = datetime.date.fromisoformat(starts[i])7e = datetime.date.fromisoformat(ends[i])8result.append((e - s).days)
  20. 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]result
  21. for i in range(len(starts)):

    4result = []5for i in range(len(starts)):6    s = datetime.date.fromisoformat(starts[i])
  22. 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.

library.py
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_datetime handles it unambiguously regardless of system locale; for non-ISO inputs use format= explicitly.
  • .dt.days gives 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 an int64 Series returns Python int values; naive timedelta.days is also a Python int — 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.