按日期将数据帧拆分为多个帧

2024-10-03 21:34:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我完全理解这个问题有几个版本,但似乎没有一个能抓住我问题的核心。我有一个熊猫数据帧,从2015年到现在大约有72000行。我使用的是一种计算方法,它可以为给定的文本集找到最有影响力的单词(tf\u idf)。这个计算不考虑时间,所以我需要将我的主数据帧分解为基于时间的段,理想情况下是每15天和30天(或者n天,实际上不是周/月),然后在每个时间段的数据帧上运行计算,以便查看和绘制随时间推移出现的单词越来越少。你知道吗

我已经能够用以下方法半手动地构建其中的一部分:

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个日期,这是我作为测试创建的预期日期。如何按增量拆分数据帧并为每个数据帧运行计算?你知道吗

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个数据帧来运行函数?你知道吗

另外,我不完全理解如何具体地按天数来分解['STATUSDATE']?你知道吗

我想尽量避免迭代,但我知道我可能不得不在这里。你知道吗

谢谢


Tags: of数据fordatadatetime时间单词start
2条回答

像这样的怎么样。它创建了一个非空数据帧字典,这些非空数据帧在 期间的开始日期。你知道吗

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}

假设您有这样一个数据帧:

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)

相关问题 更多 >