import numpy as np
import pandas as pd
n = 10
nrows = 33
index = pd.date_range('2000-1-1', periods=nrows, freq='D')
df = pd.DataFrame(np.ones(nrows), index=index)
print(df)
# 0
# 2000-01-01 1
# 2000-01-02 1
# ...
# 2000-02-01 1
# 2000-02-02 1
first = df.index.min()
last = df.index.max() + pd.Timedelta('1D')
secs = int((last-first).total_seconds()//n)
periodsize = '{:d}S'.format(secs)
result = df.resample(periodsize, how='sum')
print('\n{}'.format(result))
assert len(result) == n
verim ziyade bize
0
2000-01-01 00:00:00 4
2000-01-04 07:12:00 3
2000-01-07 14:24:00 3
2000-01-10 21:36:00 4
2000-01-14 04:48:00 3
2000-01-17 12:00:00 3
2000-01-20 19:12:00 4
2000-01-24 02:24:00 3
2000-01-27 09:36:00 3
2000-01-30 16:48:00 3
değerleri tam olarak 10 alt örneklerini verir, böylece biz include_lowest=True
belirtebilirsiniz -column, orijinal DataFrame 1 değerleri ile doldurulduğundan, toplanan satırların sayısını gösterir. 4 satır ve 3'ün kalıbı, yaklaşık 33 satır, 10 gruba eşit olarak gruplandırılamadığından, alabileceğiniz kadardır.
Açıklama: Bu basit DataFrame düşünün:
n = 2
nrows = 5
index = pd.date_range('2000-1-1', periods=nrows, freq='D')
df = pd.DataFrame(np.ones(nrows), index=index)
# 0
# 2000-01-01 1
# 2000-01-02 1
# 2000-01-03 1
# 2000-01-04 1
# 2000-01-05 1
df.resample('2D', how='sum')
kullanma grupların doğru sayıda df.resample('3D', how='sum')
kullanma gruplar
In [366]: df.resample('2D', how='sum')
Out[366]:
0
2000-01-01 2
2000-01-03 2
2000-01-05 1
sayısı yanlış verir verir ama ikinci grup, ev olmayan 2000-01-04
'dan başlar. enly iki eşit aralıklı gruba DataFrame bölmek:
In [367]: df.resample('3D', how='sum')
Out[367]:
0
2000-01-01 3
2000-01-04 2
daha iyi yapmak için, gün içinde daha ince zaman çözünürlükte çalışmak gerekir. Timedelta
s bir total_seconds
yöntemine sahip olduğundan, saniye olarak çalışalım.
In [373]: (pd.Timedelta(days=5)/pd.Timedelta('1S'))/2
Out[373]: 216000.0
Tamam, şimdi tek ihtiyacımız bu genelleme için bir yoldur: Yukarıdaki örneğin Böylece istenen frekans dize 5 günde 216.000 * 2 saniye olmadığından
In [374]: df.resample('216000S', how='sum')
Out[374]:
0
2000-01-01 00:00:00 3
2000-01-03 12:00:00 2
olurdu . bunun doğru çıkıp günlerde fark yaratıyor çünkü
first = df.index.min()
last = df.index.max() + pd.Timedelta('1D')
Biz fazladan bir gün ekleyin: Biz endeksinde minimum ve maksimum tarihleri isteyeceksiniz. yılında Yukarıdaki örnek, 2000/01/05 ve 2000-01-01 için zaman damgaları arasındaki tek 4 gün,
In [377]: (pd.Timestamp('2000-01-05')-pd.Timestamp('2000-01-01')).days
Out[378]: 4
Ama işlenmiş örnekte de görebileceğiniz gibi, DataFrame 5 satır var var 5 gününü temsil eder. Bu yüzden fazladan bir gün eklememiz gerektiği mantıklı.
Şimdi her eşit aralıklı gruptaki saniye sayısını doğru hesaplayabiliriz:
ilginç
secs = int((last-first).total_seconds()//n)
Bu yeterince basit görünüyor. Ekstra açıklamayı da takdir ediyorum. Teşekkürler! –