तिथियां अजगर द्वारा एकाधिक फ्रेम्स में spliting DataFrame

वोट
0

मैं पूरी तरह से समझते वहाँ इस सवाल के कुछ संस्करण हैं, लेकिन कोई भी मेरी समस्या के मूल में प्राप्त करने के लिए लग रहे हैं। अब मैं करने के लिए 2015 से लगभग 72,000 पंक्तियों के साथ एक पांडा Dataframe है। मैं एक गणना के पाठ (tf_idf) का एक सेट के लिए सबसे प्रभावी शब्द पता चलता है कि उपयोग कर रहा हूँ। इस गणना समय के लिए खाते में नहीं है, तो मैं समय-आधारित सेगमेंट में नीचे अपने मुख्य Dataframe तोड़ने के लिए की जरूरत है, आदर्श हर 15 और 30 दिनों के (या n दिनों वास्तव में, नहीं सप्ताह / माह), तो प्रत्येक पर गणना चलाने के समय हिस्सों में बंटा हुआ Dataframe आदेश को देखने के लिए और साजिश में कौन से शब्द तक अधिक और कम समय के साथ आते हैं।

मैं इस बाहर निम्नलिखित के साथ अर्द्ध मैन्युअल इस के निर्माण भाग करने में सक्षम है:

def dateRange():
    start = input(Enter a start date (MM-DD-YYYY) or '30' for last 30 days: )
    if (start != '30'):
        datetime.strptime(start, '%m-%d-%Y')
        end = input(Enter a end date (MM-DD-YYYY): )
        datetime.strptime(end, '%m-%d-%Y')
        dataTime = data[(data['STATUSDATE'] > start) & (data['STATUSDATE'] <= end)]
    else:
        dataTime = data[data.STATUSDATE > datetime.now() - pd.to_timedelta('30day')]
    return dataTime

dataTime = dateRange()
dataTime2 = dateRange()

def calcForDateRange(dateRangeFrame):
    ##### LONG FUNCTION####
    return word and number

calcForDateRange(dataTime)
calcForDateRange(dataTime2)

यह काम करता है - हालांकि, मैं मैन्युअल रूप से 2 दिनांकों जो उम्मीद है के रूप में मैं एक परीक्षण के रूप में इस बनाया बनानी होगी। मैं कैसे वृद्धि के साथ Dataframe विभाजित है और प्रत्येक dataframe के लिए गणना चला सकता हूँ?

dictsकथित तौर पर जिस तरह से यह करने के लिए कर रहे हैं। मैंने कोशिश की:

dict_of_dfs = {}
for n, g in data.groupby(data['STATUSDATE']):
    dict_of_dfs[n] = g

for frame in dict_of_dfs:
    calcForDateRange(frame)

Dict परिणाम था 2015-01-02: Dataframeकोई फ्रेम के साथ। मैं एक 100 में इस नीचे कैसे तोड़ सकते हैं या तो Dataframes पर मेरे समारोह को चलाने के लिए?

इसके अलावा, मैं पूरी तरह से समझ में नहीं आता कि कैसे तोड़ने के लिए ['STATUSDATE']दिन विशेष रूप से की संख्या से?

मैं संभव के रूप में ज्यादा के रूप में बार-बार दोहराना से बचने के लिए होगा, लेकिन मैं जानता हूँ कि मैं शायद someehere करना होगा।

धन्यवाद

02/12/2019 को 23:52
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
1

आइए हम मान लेते आप इस प्रकार का डेटा फ्रेम करते हैं:

date = pd.date_range(start='1/1/2018', end='31/12/2018', normalize=True)
x = np.random.randint(0, 1000, size=365)

df = pd.DataFrame(x, columns = ["X"])
df['Date'] = date
df.head()

आउटपुट :

    X   Date
0   328 2018-01-01
1   188 2018-01-02
2   709 2018-01-03
3   259 2018-01-04
4   131 2018-01-05

तो यह डेटा फ्रेम 365 पंक्तियाँ, वर्ष के प्रत्येक दिन के लिए एक है।

अब अगर आप समूह में अधिकतम 20 दिनों के अंतराल में इस डेटा चाहते हैं और एक dict के लिए प्रत्येक समूह असाइन करते हैं, आप निम्न कर सकते हैं

df_dict = {}
for k,v in df.groupby(pd.Grouper(key="Date", freq='20D')):
    df_dict[k.strftime("%Y-%m-%d")] = pd.DataFrame(v)
print(df_dict)
03/12/2019 को 00:17
का स्रोत उपयोगकर्ता

वोट
1

इस जैसे किसी और के बारे में क्या राय है। यह गैर खाली अवधि की प्रारंभिक तिथि पर keyed dataframes का एक शब्दकोश बनाता है।

import datetime as dt

start = '12-31-2017'
interval_days = 30

start_date = pd.Timestamp(start)
end_date = pd.Timestamp(dt.date.today() + dt.timedelta(days=1))
dates = pd.date_range(start=start_date, end=end_date, freq=f'{interval_days}d')

sub_dfs = {d1.strftime('%Y%m%d'): df.loc[df.dates.ge(d1) & df.dates.lt(d2)]
           for d1, d2 in zip(dates, dates[1:])}
# Remove empty dataframes.
sub_dfs = {k: v for k, v in sub_dfs.items() if not v.empty}
03/12/2019 को 00:24
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more