Skip to content

Commit

Permalink
Python: Fix date/time transforms. (apache#5667)
Browse files Browse the repository at this point in the history
  • Loading branch information
rdblue authored Aug 29, 2022
1 parent 57195c4 commit 97c85aa
Showing 1 changed file with 9 additions and 13 deletions.
22 changes: 9 additions & 13 deletions python/pyiceberg/utils/datetime.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@

def micros_to_days(timestamp: int) -> int:
"""Converts a timestamp in microseconds to a date in days"""
return (datetime.fromtimestamp(timestamp / 1_000_000) - EPOCH_TIMESTAMP).days
return timedelta(microseconds=timestamp).days


def micros_to_time(micros: int) -> time:
Expand Down Expand Up @@ -133,28 +133,24 @@ def to_human_timestamp(timestamp_micros: int) -> str:
return (EPOCH_TIMESTAMP + timedelta(microseconds=timestamp_micros)).isoformat()


def micros_to_hours(timestamp: int) -> int:
"""Converts a timestamp in microseconds to a date in hours"""
return int((datetime.utcfromtimestamp(timestamp // 1_000_000) - EPOCH_TIMESTAMP).total_seconds() / 3600)
def micros_to_hours(micros: int) -> int:
"""Converts a timestamp in microseconds to hours from 1970-01-01T00:00"""
return micros // 3_600_000_000


def days_to_months(days: int) -> int:
"""Creates a date from the number of days from 1970-01-01"""
d = days_to_date(days)
return (d.year - EPOCH_DATE.year) * 12 + (d.month - EPOCH_DATE.month)


def micros_to_months(timestamp: int) -> int:
dt = micros_to_timestamp(timestamp)
return (dt.year - EPOCH_TIMESTAMP.year) * 12 + (dt.month - EPOCH_TIMESTAMP.month) - (1 if dt.day < EPOCH_TIMESTAMP.day else 0)
def micros_to_months(micros: int) -> int:
dt = micros_to_timestamp(micros)
return (dt.year - EPOCH_TIMESTAMP.year) * 12 + (dt.month - EPOCH_TIMESTAMP.month)


def days_to_years(days: int) -> int:
return days_to_date(days).year - EPOCH_DATE.year


def micros_to_years(timestamp: int) -> int:
dt = micros_to_timestamp(timestamp)
return (dt.year - EPOCH_TIMESTAMP.year) - (
1 if dt.month < EPOCH_TIMESTAMP.month or (dt.month == EPOCH_TIMESTAMP.month and dt.day < EPOCH_TIMESTAMP.day) else 0
)
def micros_to_years(micros: int) -> int:
return micros_to_timestamp(micros).year - EPOCH_TIMESTAMP.year

0 comments on commit 97c85aa

Please sign in to comment.