Spliting DataFrame в нескольких фреймов по датам Python

голоса
0

Я полностью понимаю, что есть несколько версий эти вопросы там, но никто не похоже, чтобы получить в центре моей проблемы. У меня есть панд Dataframe с примерно 72000 строк с 2015 года по настоящее время. Я использую расчет, который находит наиболее впечатляющие слова для данного набора текста (tf_idf). Этот расчет не учитывает время, так что мне нужно, чтобы сломать мой главный Dataframe вниз в повременных сегментов, в идеале каждые 15 и 30 дней (или п дней действительно, не неделя / месяц), а затем запустить расчет на каждый раз, сегментированный 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)

Результат ДИКТ был 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 дней и назначить каждую группу в Словарь, вы можете сделать следующее

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

Как о чем-то вроде этого. Это создает словарь непустого 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