Timestamp 기대 조건과 시간 경계
Timestamp 기대 조건은 Timestamp 열에 적용하며 Date 열은 지원하지 않습니다. 정적 시각은 ISO8601 문자열이나 Python datetime으로 지정할 수 있고 시간대가 명확해야 합니다.
고정 시각과 비교
from datetime import datetime, timezone
from transforms import expectations as E
strictly_after = E.col("timestamp").is_after("2020-12-14T11:32:23+0000")
strictly_before = E.col("timestamp").is_before(
datetime(2017, 11, 28, 23, 55, 59, 342380, tzinfo=timezone.utc)
)
at_or_after = E.col("timestamp").is_on_or_after("2020-12-14T11:32:23+0000")
at_or_before = E.col("timestamp").is_on_or_before("2020-12-14T11:32:23+0000")
is_after와 is_before는 경계를 포함하지 않고, is_on_or_after와 is_on_or_before는 포함합니다.
정적 시각 인자에 datetime.now()에서 만든 값을 넣는 방식은 지원하지 않습니다. 결과가 경고 없이 잘못될 수 있고 Data Health와 다른 메시지에 실제로 의도한 비교 시각이 표시되지 않을 수 있습니다. 실행 시점을 기준으로 검사하려면 아래 상대 시간 API를 사용합니다.
다른 Timestamp 열과 비교
다른 열 이름과 선택적인 정수 초 오프셋을 지정합니다. 비교식은 항상 첫 번째 열 OP (두 번째 열 + 오프셋)입니다.
| 표현식 | 조건 |
|---|---|
E.col("timestamp").is_after_col("second_timestamp") | 첫 열이 둘째 열보다 늦음 |
E.col("timestamp").is_on_or_after_col("second_timestamp") | 첫 열이 둘째 열과 같거나 늦음 |
E.col("timestamp").is_before_col("second_timestamp", 3600) | 첫 열이 둘째 열에 1시간을 더한 값보다 빠름 |
E.col("timestamp").is_on_or_before_col("second_timestamp", -7200) | 첫 열이 둘째 열에서 2시간을 뺀 값과 같거나 빠름 |
양수와 음수 오프셋은 비교 대상인 두 번째 열에 더해집니다. 이를 두 열의 순서나 뺄셈 방향을 바꾸는 인자로 해석하지 않습니다.
검사 실행 시점에 대한 상대 비교
정수 초 또는 Python timedelta로 양의 오프셋을 지정합니다. 음수 오프셋이 필요하면 두 API 중 반대 방향을 선택합니다.
| 메서드 | 비교할 값 |
|---|---|
.timestamp_offset_from_current_time() | timestamp - 검사 시각 |
.timestamp_offset_to_current_time() | 검사 시각 - timestamp |
메서드 뒤에 일반 비교 연산자를 연결합니다. 검사 생성과 실행 시각에 차이가 있어 정밀도는 몇 분 수준이며, 실제 사용한 시각은 검사 실행 후 Expectations 결과에 표시됩니다.
from datetime import timedelta
from transforms import expectations as E
A = E.col("timestamp").timestamp_offset_from_current_time().lt(3600)
B = E.col("timestamp").timestamp_offset_from_current_time().gt(timedelta(hours=2))
C = E.col("timestamp").timestamp_offset_to_current_time().lt(5400)
D = E.col("timestamp").timestamp_offset_to_current_time().gt(timedelta(hours=2))
- A는 미래 방향 차이가 1시간 미만인지 확인합니다. 과거 시각의 차이는 음수여서 통과합니다.
- B는 검사 시각보다 2시간을 초과하여 미래인지 확인합니다.
- C는 과거 방향 차이가 90분 미만인지 확인합니다. 미래 시각의 차이는 음수여서 통과합니다.
- D는 검사 시각보다 2시간을 초과하여 과거인지 확인합니다.
인수는 양수지만 실제로 비교하는 차이가 음수가 될 수 있습니다. 메서드 이름만으로 반대 방향의 시각을 자동 제외하지 않습니다.
경계의 예
같은 시간대의 1월 1일 16시를 정확한 설명용 기준 시각으로 정하면 다음과 같습니다.
| 검사 | 13시 | 14시 | 15시 | 16시 | 17시 | 18시 | 19시 |
|---|---|---|---|---|---|---|---|
| A | 통과 | 통과 | 통과 | 통과 | 실패 | 실패 | 실패 |
| B | 실패 | 실패 | 실패 | 실패 | 실패 | 실패 | 통과 |
| C | 실패 | 실패 | 통과 | 통과 | 통과 | 통과 | 통과 |
| D | 통과 | 실패 | 실패 | 실패 | 실패 | 실패 | 실패 |
gt와 lt는 엄격한 비교입니다. B의 18시와 D의 14시는 정확히 2시간이므로 실패합니다. A의 17시도 정확히 1시간이므로 실패합니다. 경계를 포함하려면 gte나 lte를 사용합니다.
최소/최대와 그룹별 시각
Timestamp 비교 대부분은 열의 최소/최대 속성과 그룹별 속성에도 적용할 수 있습니다.
from datetime import timedelta
from transforms import expectations as E
latest_after_boundary = (
E.col("timestamp").max_value().is_after("2020-12-14T12:23:50+0000")
)
oldest_within_day = (
E.col("timestamp").min_value()
.timestamp_offset_to_current_time().lt(timedelta(days=1))
)
latest_per_category_after_60_days = (
E.group_by("category")
.col("timestamp")
.max_value()
.timestamp_offset_from_current_time()
.gt(timedelta(days=60))
)
마지막 조건은 분류마다 최신 시각이 검사 시점보다 60일을 초과하여 미래인지 확인합니다. 상대 인자의 timedelta는 고정 기간이며 달력상 두 달과 같지 않습니다. 달력 월 수를 직접 받는 인자는 제공하지 않습니다.