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
पैदावार से
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
मूल्यों 0
में देता है निर्दिष्ट कर सकते हैं -कॉलम समेकित पंक्तियों की संख्या इंगित करता है, क्योंकि मूल डेटाफ्रेम 1 के मानों से भरा था। 4 और 3 का पैटर्न लगभग उतना ही है जितना आप प्राप्त कर सकते हैं क्योंकि 33 पंक्तियों को समान रूप से 10 समूहों में समूहीकृत नहीं किया जा सकता है।
स्पष्टीकरण: इस सरल DataFrame पर विचार करें:
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')
का प्रयोग समूहों की सही संख्या देता समूहों
In [366]: df.resample('2D', how='sum')
Out[366]:
0
2000-01-01 2
2000-01-03 2
2000-01-05 1
df.resample('3D', how='sum')
का उपयोग करते हुए की गलत संख्या देता है, लेकिन दूसरा समूह 2000-01-04
पर शुरू होता है जो ev नहीं है enly DataFrame विभाजित दो समान रूप से स्थान दिया गया समूहों में:
In [367]: df.resample('3D', how='sum')
Out[367]:
0
2000-01-01 3
2000-01-04 2
बेहतर करने के लिए, हम दिन की तुलना में एक बेहतर समय संकल्प पर काम करने की जरूरत है। चूंकि Timedelta
के पास total_seconds
विधि है, चलिए सेकंड में काम करते हैं।ऊपर के उदाहरण के लिए तो, इच्छित आवृत्ति स्ट्रिंग होगा
In [374]: df.resample('216000S', how='sum')
Out[374]:
0
2000-01-01 00:00:00 3
2000-01-03 12:00:00 2
के बाद से वहाँ 5 दिनों में 216000 * 2 सेकंड हैं:
In [373]: (pd.Timedelta(days=5)/pd.Timedelta('1S'))/2
Out[373]: 216000.0
ठीक है, तो अब हम सभी की जरूरत है इस सामान्यीकरण करने के लिए एक रास्ता है । हम सूचकांक में न्यूनतम और अधिकतम तिथियां चाहते हैं:
first = df.index.min()
last = df.index.max() + pd.Timedelta('1D')
हम एक अतिरिक्त दिन जोड़ते हैं क्योंकि इससे दिन में अंतर ठीक हो जाता है। में उपरोक्त उदाहरण, वहाँ 2000/01/05 और 2000/01/01 के लिए मुहर के बीच केवल 4 दिन,
In [377]: (pd.Timestamp('2000-01-05')-pd.Timestamp('2000-01-01')).days
Out[378]: 4
लेकिन जैसा कि हम काम उदाहरण में देख सकते, DataFrame 5 पंक्तियां हैं कर रहे हैं 5 दिनों का प्रतिनिधित्व करता है। तो यह समझ में आता है कि हमें एक अतिरिक्त दिन जोड़ने की जरूरत है।
अब हम साथ प्रत्येक समान रूप से स्थान दिया गया समूह में सेकंड की सही संख्या की गणना कर सकते हैं:
secs = int((last-first).total_seconds()//n)
यह काफी आसान लगता है। मैं भी अतिरिक्त स्पष्टीकरण की सराहना करता हूं। धन्यवाद! –