Saya memiliki dua tanggal waktu di antaranya saya ingin menghasilkan interval reguler 4 jam (tidak termasuk interval terakhir, yang bisa kurang dari 4 jam jika ada kurang dari 4 jam antara stempel waktu sebelumnya dan end).

Saya terjebak pada pembuatan interval dengan pandas.date_range, yang hanya mengembalikan stempel waktu end. Sebagai contoh:

import pandas
from datetime import datetime

start = datetime(2021, 4, 2, 20, 40, 0)
end = datetime(2021, 4, 4, 18, 20, 0)


dates = pandas.date_range(start=end, end=end, freq='4H')
dates

DatetimeIndex(['2021-04-04 18:20:00'], dtype='datetime64[ns]', freq='4H')

Tujuannya adalah untuk menghasilkan daftar pasangan datetime seperti:

[['2021-04-02 20:40:00', '2021-04-03 00:40:00'], ['2021-04-03 00:40:00', '2021-04-03 04:40:00']...['2021-04-04 16:40:00', '2021-04-04 18:20:00']] #last pair can be cut off by `end`.  

Apa yang saya lakukan salah dalam sintaks dan bagaimana cara menghasilkan daftar interval berpasangan dari menggunakan pandas.date_range ?

2
the_darkside 4 April 2021, 21:42

1 menjawab

Jawaban Terbaik

Ada kesalahan ketik (start=end) yang menyebabkan dates hanya memiliki 1 nilai.

Tetapi memperbaiki kesalahan ketik hanya memberi Anda rentang tanggal yang datar. Jika Anda menginginkan pasangan bersarang itu, Anda dapat menggeser dates sebanyak 4 jam dan zip():

dates = pandas.date_range(start=start, end=end, freq='4H')
shift = dates + pandas.Timedelta(hours=4)

pairs = list(zip(dates, shift))

# [(Timestamp('2021-04-02 20:40:00', freq='4H'),
#   Timestamp('2021-04-03 00:40:00', freq='4H')),
#  (Timestamp('2021-04-03 00:40:00', freq='4H'),
#   Timestamp('2021-04-03 04:40:00', freq='4H')),
#  (Timestamp('2021-04-03 04:40:00', freq='4H'),
#   Timestamp('2021-04-03 08:40:00', freq='4H')),
# ...

Atau untuk daftar daftar alih-alih daftar tupel:

pairs = list(map(list, zip(dates, shift)))
2
tdy 4 April 2021, 20:30