如何在大Pandas身上有效地展开日期跨度?

2024-06-25 22:37:17 发布

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

我有熊猫数据框(出勤记录)。里面有当地学校的出勤记录。在

每行有4列:1)缺席学生的姓名(姓名),2)学生的地址(地址),3)缺勤的第一天(开始),和4)最后一天的缺勤(结束)。在

例如,一行可以是:

Bobby   101 1st Street  9/1/2014     9/3/2014

这意味着鲍比每天9月1日至9月3日(包括9月1日)缺席。在

我想按如下方式展开表格:

^{pr2}$

到目前为止,我有一些代码(如下)可以完成这项工作,但是对于大型表来说,它的速度非常慢,因为它基本上是逐行遍历表。有什么办法让事情更快些吗?在

import pandas as pd
def full_data(dataframe):
    allframe = pd.DataFrame()
    for i in dataframe.index:
        newframe = pd.DataFrame()
        newframe['dates'] = pd.date_range(dataframe.iloc[i].start, dataframe.iloc[i].end, freq = 'D')
        newframe['name'] = dataframe.iloc[i]['name']
        newframe['address'] = dataframe.iloc[i]['address']            
        allframe = allframe.append(newframe)
        if i%1000 == 0:
            print i
    return allframe

attendance_records = full_data(attendance_records)

Tags: namedataframedata地址记录学生fullpd
2条回答

对日期进行日期运算,不需要填写缺失的日期。然后按名称分组并计算天数。在

from datetime import timedelta

data = pd.read_csv(StringIO('''Bobby,   101 1st Street,  9/1/2014,     9/3/2014'''), 
                   names=['Name', 'Address', 'Start', 'End'], parse_dates=[2, 3])
#add a day to get the number of days inclusive
data["Days"] = (data.End - data.Start) + timedelta(days=1)
data.groupby('name').sum()["Days"]

pandas函数append对于较大的数据帧来说可能会很慢。相反,我建议将newframes存储在python列表中,而不是使用只附加所有帧一次的concat函数。在

import pandas as pd
def full_data(dataframe):
    allframes = []
    for i in dataframe.index:
        newframe = pd.DataFrame()
        newframe['dates'] = pd.date_range(dataframe.iloc[i].start, dataframe.iloc[i].end, freq = 'D')
        newframe['name'] = dataframe.iloc[i]['name']
        newframe['address'] = dataframe.iloc[i]['address']            
        allframes.append(newframe)
    return concat(allframes)

注意,这还没有经过测试。在

相关问题 更多 >