मेरे पास दो डेटा फ्रेम हैं उदा।

कम समय सीमा (4 घंटे)

Time                  Data_4h
1/1/01 00:00          1.1
1/1/01 06:00          1.2
1/1/01 12:00          1.3
1/1/01 18:00          1.1
2/1/01 00:00          1.1
2/1/01 06:00          1.2
2/1/01 12:00          1.3
2/1/01 18:00          1.1
3/1/01 00:00          1.1
3/1/01 06:00          1.2
3/1/01 12:00          1.3
3/1/01 18:00          1.1

लंबी समय सीमा (1 दिन)

Time                  Data_1d
1/1/01 00:00          1.1
2/1/01 00:00          1.6
3/1/01 00:00          1.0

मैं लंबे समय सीमा डेटा से डेटा के साथ कम समय सीमा डेटा लेबल करना चाहता हूं लेकिन एन -1 दिन, एनएएन छोड़कर जहां एन -1 दिन मौजूद नहीं है।

उदाहरण के लिए,

4h और 1d . को मिलाकर अंतिम मर्ज किया गया डेटा

Time                  Data_4h     Data_1d
1/1/01 00:00          1.1         NaN
1/1/01 06:00          1.2         NaN
1/1/01 12:00          1.3         NaN
1/1/01 18:00          1.1         NaN
2/1/01 00:00          1.1         1.1
2/1/01 06:00          1.2         1.1
2/1/01 12:00          1.3         1.1
2/1/01 18:00          1.1         1.1 
3/1/01 00:00          1.1         1.6
3/1/01 06:00          1.2         1.6
3/1/01 12:00          1.3         1.6
3/1/01 18:00          1.1         1.6

तो 1/1 के लिए - उसने 31/12 खोजने की कोशिश की लेकिन इसे नहीं मिला इसलिए इसे NaN के रूप में लेबल किया गया। 2/1 के लिए, उसने 1/1 की खोज की और उन संपूर्णों को 1.1 के साथ लेबल किया - 1/1 के लिए मान। 3/1 के लिए, इसने 2/1 की खोज की और उन संपूर्णों को 1.6 के साथ लेबल किया - 2/1 के लिए मान।

यह ध्यान रखना महत्वपूर्ण है कि समय सीमा डेटा में बड़े अंतराल हो सकते हैं। इसलिए मैं बड़ी समय सीमा में सीधे पंक्तियों तक नहीं पहुंच सकता।

इसे करने का बेहतरीन तरीका क्या है?

वर्तमान में मैं छोटी समय सीमा की सभी पंक्तियों के माध्यम से पुनरावृति कर रहा हूं और फिर एक फिल्टर का उपयोग करके बड़ी समय सीमा की खोज कर रहा हूं जैसे:

large_tf_data[(large_tf_data.index <= target_timestamp)][0]

जहां छोटी समय सीमा डेटा फ्रेम में प्रत्येक पंक्ति पर target_timestamp की गणना की जाती है।

यह बेहद धीमा है! इसे कैसे तेज करें इस पर कोई सुझाव?

1
BYZZav 16 मई 2018, 20:20

1 उत्तर

सबसे बढ़िया उत्तर

सबसे पहले खजूर का ध्यान रखें

dayfirstme = lambda d: pd.to_datetime(d.Time, dayfirst=True)
df = df.assign(Time=dayfirstme)
df2 = df2.assign(Time=dayfirstme)

फिर df2 को किसी उपयोगी चीज़ में बदलें

d2 = df2.assign(Time=lambda d: d.Time + pd.Timedelta(1, 'D')).set_index('Time').Data_1d

जादू लागू करें

df.join(df.Time.dt.date.map(d2).rename(d2.name))

                  Time  Data_4h  Data_1d
0  2001-01-01 00:00:00      1.1      NaN
1  2001-01-01 06:00:00      1.2      NaN
2  2001-01-01 12:00:00      1.3      NaN
3  2001-01-01 18:00:00      1.1      NaN
4  2001-01-02 00:00:00      1.1      1.1
5  2001-01-02 06:00:00      1.2      1.1
6  2001-01-02 12:00:00      1.3      1.1
7  2001-01-02 18:00:00      1.1      1.1
8  2001-01-03 00:00:00      1.1      1.6
9  2001-01-03 06:00:00      1.2      1.6
10 2001-01-03 12:00:00      1.3      1.6
11 2001-01-03 18:00:00      1.1      1.6

मुझे यकीन है कि और भी तरीके हैं लेकिन मैं अब इस बारे में नहीं सोचना चाहता था।

1
piRSquared 16 मई 2018, 20:40