>  기사  >  백엔드 개발  >  시간 범위 내에서 배열 요소를 정규화하는 방법은 무엇입니까?

시간 범위 내에서 배열 요소를 정규화하는 방법은 무엇입니까?

PHPz
PHPz앞으로
2024-02-08 21:30:35746검색

시간 범위 내에서 배열 요소를 정규화하는 방법은 무엇입니까?

php 편집기 Xinyi가 시간 범위 내에서 배열 요소를 표준화하는 방법을 소개합니다. 개발 중에는 시계열 데이터를 처리해야 하는 경우가 많으며, 이러한 데이터에는 시간이 흐르거나 누락되는 상황이 있을 수 있습니다. 데이터의 정확성과 완전성을 보장하려면 배열의 요소를 표준화해야 합니다. 정규화는 배열의 요소를 시간순으로 배치하고 누락된 시점을 채웁니다. 아래에서는 이 기능을 구현하는 방법을 자세히 설명합니다.

질문 내용

시간 범위에 걸쳐 요소 배열을 정규화하려고 합니다. 2022년 1월 1일에 20건의 은행 거래가 발생했다고 가정해 보겠습니다.

으아악

발생 날짜 외에는 데이터가 없지만 하루 중 한 시간을 할당하고 싶으므로 결과는 다음과 같습니다.

으아악

In go에는 요소 배열의 인덱스에 대한 하루 중 시간의 정규화를 계산하는 함수가 있습니다.

으아악

그런데 2022/1/1 00:00부터 2022/1/1 23:59까지의 시간 범위에서 4요소 배열의 인덱스 0에서 실수로 2022/1/1 05:59를 계산했는데, 대신 제가 예상한 대로였습니다. 2022년 1월 1일 00:00을 참조하세요. 이러한 조건에서 올바르게 작동하는 유일한 것은 인덱스 3입니다.

그럼 정규화에 내가 뭘 잘못하고 있는 걸까요?

편집자:

@icza가 수정한 기능입니다

으아악

예: 시작 날짜와 종료 날짜가 2022/01/01 00:00 - 2022/01/01 00:03,我们的银行交易数组中有 3 个条目,我们希望获取第 3 号交易的标准化时间(数组中的 2):

라고 가정해 보겠습니다. 으아악

시작 시간과 종료 시간 사이의 정규화된 시간(00:0000:03),并且想要查找数组(大小 3)中最后一个条目(索引 2부터)은 4분뿐이므로 결과는 다음과 같습니다.

으아악

또는 범위의 마지막 순간, 즉 00:03입니다.

재현 가능한 예는 다음과 같습니다. https://go.dev/play/p/ezwkqanv1at

해결 방법

n 点之间有 n-1 段。这意味着,如果您想在插值中包含 startend,则时间段数(即 delta)为 arraysize - 1에 있습니다.

또한, 그렇다면 1 添加到 index,则结果不可能是 start (您将跳过 00:00).

올바른 알고리즘은 다음과 같습니다:

으아악

go 놀이터에서 사용해 보세요.

또한 트랜잭션이 많은 경우(하루 중 분 단위로 정렬, 약 1,000개) 동일한 타임스탬프(동일한 시간 및 분)를 사용하는 여러 트랜잭션으로 쉽게 끝날 수 있습니다. 이를 방지하려면 초 또는 밀리초와 같이 분보다 작은 정밀도를 사용하세요.

으아악

예, 이렇게 하면 타임스탬프 초가 반드시 0일 필요는 없지만 더 높은 거래량에 대해 서로 다른 고유한 타임스탬프를 갖게 됩니다.

거래가 하루에 몇 초(예: 86400)인 경우 이 "단위"를 완전히 제거하고 time.duration 자체(예: 나노초)를 사용할 수 있습니다. 이는 가장 많은 수의 거래에도 타임스탬프 고유성을 보장합니다:

으아악

100만 건의 거래로 테스트한 결과 처음 15개 시간 부분은 다음과 같습니다(초 미만 부분에서만 지연됨).

으아악

이것을 go 놀이터에서 사용해 보세요.

위 내용은 시간 범위 내에서 배열 요소를 정규화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제