使用Pandas追加数据时出现问题

时间:2019-11-06 16:43:10

标签: python pandas

问题:-我想构建一个逻辑来获取诸如考勤数据,及时,员工ID之类的数据,并返回一个包含员工ID,时间,出勤日期以及基本上在哪个位置的数据框员工进入。 (假设In time是日期14-10-2019的9:30:00,因此,如果雇员在9:30到来,则在该日期和该列中插入一个值。)

下面给出示例

我花了很多时间来为这个问题建立逻辑,但未能建立。

dataset

我有一个像这样的数据集。

我想要这样的输出,以便无论在什么时间(员工输入的时间),它都只将数据插入到“时间”列中,而只有“列”: output

这是我的代码,但唯一重复的最后一个循环。

temp =[]
for date in nf['DaiGong']:
    for en in nf['EnNo']:
        for i in nf['DateTime']:


        col=['EnNo','Date','InTime','9:30-10:30','10:30-11:00','11:00-11:30','11:30-12:30','12:30-13:00','13:00-13:30']
        ndf=pd.DataFrame(columns=col)


        if i < '10:30:00' and i > '09:30:00':
            temp.append(1)
            ndf['9:30-10:30'] = temp
            ndf['InTime'] = i
            ndf['Date'] = date
            ndf['EnNo'] = en


        elif i < '11:00:00' and i > '10:30:00':
            temp.append(1)
            ndf['10:30-11:00'] = temp
            ndf['InTime'] = i
            ndf['Date'] = date
            ndf['EnNo'] = en
        elif i < '11:30:00' and i > '11:00:00':
            temp.append(1)
            ndf['11:00-11:30'] = temp
            ndf['InTime'] = i
            ndf['Date'] = date
            ndf['EnNo'] = en

        elif i < '12:30:00' and i > '11:30:00':
            temp.append(1)
            ndf['11:30-12:30'] = temp
            ndf['InTime'] = i
            ndf['Date'] = date
            ndf['EnNo'] = en

        elif i < '13:00:00' and i > '12:30:00':
            temp.append(1)
            ndf['12:30-13:00'] = temp
            ndf['InTime'] = i
            ndf['Date'] = date
            ndf['EnNo'] = en
        elif i < '13:30:00' and i > '13:00:00':
            temp.append(1)
            ndf['13:00-13:30'] = temp
            ndf['InTime'] = i
            ndf['Date'] = date
            ndf['EnNo'] = en

这是我的代码的输出。

Output

2 个答案:

答案 0 :(得分:0)

IIUC,

str

如果您有任何疑问,请告诉我

答案 1 :(得分:0)

我的测试数据:

df:
    EnNo     DaiGong  DateTime
       2  2019-10-12  09:53:56
       2  2019-10-13  09:42:00
       2  2019-10-14  12:00:01
       1  2019-11-01  11:12:00
       1  2019-11-02  10:13:45

创建助手数据:

    tdr=pd.timedelta_range("09:00:00","12:30:00",freq="30T")

    s=pd.Series( len(tdr)*["-"] )
    s[0]=1

    cls=[ t.rsplit(":",maxsplit=1)[0] for t in tdr.astype(str) ]
    cols=[ t1+"-"+t2 for (t1,t2) in zip(cls,cls[1:]) ]
    cols.append(cls[-1]+"-")

tdr:
TimedeltaIndex(['09:00:00', '09:30:00', '10:00:00', '10:30:00', '11:00:00', '11:30:00', '12:00:00', '12:30:00'], dtype='timedelta64[ns]', freq='30T') 

cols:
 ['09:00-09:30', '09:30-10:00', '10:00-10:30', '10:30-11:00', '11:00-11:30', '11:30-12:00', '12:00-12:30', '12:30-'] 

s:
0    1
1    -
2    -
3    -
4    -
5    -
6    -
7    -
dtype: object

使用“应用”和“搜索排序”来获取时间段:

df2= df.DateTime.apply(lambda t: \
         s.shift(tdr.searchsorted(t)-1,fill_value="-"))
df2.columns=cols

df2:
   09:00-09:30 09:30-10:00 10:00-10:30 10:30-11:00 11:00-11:30 11:30-12:00 12:00-12:30 12:30-
0           -           1           -           -           -           -           -      -
1           -           1           -           -           -           -           -      -
2           -           -           -           -           -           -           1      -
3           -           -           -           -           1           -           -      -
4           -           -           1           -           -           -           -      -

最后,连接两个数据帧:

df_rslt= pd.concat([df,df2],axis=1)

df_rslt:
    EnNo     DaiGong  DateTime 09:00-09:30 09:30-10:00 10:00-10:30 10:30-11:00 11:00-11:30 11:30-12:00 12:00-12:30 12:30-
0     2  2019-10-12  09:53:56           -           1           -           -           -           -           -      -
1     2  2019-10-13  09:42:00           -           1           -           -           -           -           -      -
2     2  2019-10-14  12:00:01           -           -           -           -           -           -           1      -
3     1  2019-11-01  11:12:00           -           -           -           -           1           -           -      -
4     1  2019-11-02  10:13:45           -           -           1           -           -           -           -      -