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

Python 使用Pandas追加数据时出现的问题,python,pandas,Python,Pandas,问题:-我想建立一个逻辑,获取考勤数据、时间、员工Id等数据,并返回一个数据框,其中包含员工Id、时间、考勤日期以及员工基本上在哪个时段输入的数据。(假设时间是2019年10月14日的9:30:00,因此,如果员工在该日期和该列的9:30到达,则插入一个值1。) 下面给出的示例 我花了很多时间来构建这个问题的逻辑,但都失败了 我有一个看起来像这样的数据集 我想要这样的输出,以便无论何时(雇员输入),它都只向该时间列插入数据: 这是我的代码,但它只是重复最后一个循环 temp =[] for

问题:-我想建立一个逻辑,获取考勤数据、时间、员工Id等数据,并返回一个数据框,其中包含员工Id、时间、考勤日期以及员工基本上在哪个时段输入的数据。(假设时间是2019年10月14日的9:30:00,因此,如果员工在该日期和该列的9:30到达,则插入一个值1。)

下面给出的示例

我花了很多时间来构建这个问题的逻辑,但都失败了

我有一个看起来像这样的数据集

我想要这样的输出,以便无论何时(雇员输入),它都只向该时间列插入数据:

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

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
temp=[]
nf[‘代工’中的日期:
对于nf['EnNo']中的en:
对于nf['DateTime']中的i:
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)
如果我<'10:30:00'和我>'09:30:00':
临时附加(1)
ndf['9:30-10:30']=温度
ndf['InTime']=i
ndf['Date']=日期
ndf['EnNo']=en
如果我<'11:00:00'和我>'10:30:00':
临时附加(1)
ndf['10:30-11:00']=温度
ndf['InTime']=i
ndf['Date']=日期
ndf['EnNo']=en
如果我<'11:30:00'和我>'11:00:00':
临时附加(1)
ndf['11:00-11:30']=温度
ndf['InTime']=i
ndf['Date']=日期
ndf['EnNo']=en
如果我<'12:30:00'和我>'11:30:00':
临时附加(1)
ndf['11:30-12:30']=温度
ndf['InTime']=i
ndf['Date']=日期
ndf['EnNo']=en
如果我<'13:00:00'和我>'12:30:00':
临时附加(1)
ndf['12:30-13:00']=温度
ndf['InTime']=i
ndf['Date']=日期
ndf['EnNo']=en
如果我<'13:30:00'和我>'13:00:00':
临时附加(1)
ndf['13:00-13:30']=温度
ndf['InTime']=i
ndf['Date']=日期
ndf['EnNo']=en
这是我的代码的输出

IIUC

df = pd.DataFrame({'EnNo':[2,2,2,2,2,3,3,3,3],
             'DaiGong':['2019-10-12', '2019-10-13', '2019-10-14', '2019-10-15', '2019-10-16', '2019-10-12', '2019-10-13', '2019-10-14', '2019-10-15'],
             'DateTime':['09:53:56', '10:53:56', '09:23:56', '11:53:56', '11:23:56', '10:33:56', '12:53:56', '12:23:56', '09:53:56']})

df
DaiGong DateTime    EnNo
0   2019-10-12  09:53:56    2
1   2019-10-13  10:53:56    2
2   2019-10-14  09:23:56    2
3   2019-10-15  11:53:56    2
4   2019-10-16  11:23:56    2
5   2019-10-12  10:33:56    3
6   2019-10-13  12:53:56    3
7   2019-10-14  12:23:56    3
8   2019-10-15  09:53:56    3

import datetime
df['DateTime'] = pd.to_datetime(df['DateTime']).dt.time #converting to datetime

def time_range(row): # I only wrote two conditions - add more
    i = row['DateTime']
    if i < datetime.time(10, 30, 0) and i > datetime.time(9, 30, 0):
        return '9:30-10:30'
    elif i < datetime.time(11, 0, 0) and i > datetime.time(10, 30, 0):
        return '10:30-11:00'
    else:
        return 'greater than 11:00'


df['time range'] = df.apply(time_range, axis=1)
df1 = pd.concat([df[['EnNo', 'DaiGong', 'DateTime']], pd.get_dummies(df['time range'])], axis=1)
df1
EnNo    DaiGong DateTime    10:30-11:00 9:30-10:30  greater than 11:00
0   2   2019-10-12  09:53:56    0   1   0
1   2   2019-10-13  10:53:56    1   0   0
2   2   2019-10-14  09:23:56    0   0   1
3   2   2019-10-15  11:53:56    0   0   1
4   2   2019-10-16  11:23:56    0   0   1
5   3   2019-10-12  10:33:56    1   0   0
6   3   2019-10-13  12:53:56    0   0   1
7   3   2019-10-14  12:23:56    0   0   1
8   3   2019-10-15  09:53:56    0   1   0

To get sum of count by employee,

df1.groupby(['EnNo'], as_index=False).sum()
df=pd.DataFrame({'EnNo':[2,2,2,2,3,3,3,3],
“代工”:[“2019-10-12”、“2019-10-13”、“2019-10-14”、“2019-10-15”、“2019-10-16”、“2019-10-12”、“2019-10-13”、“2019-10-14”、“2019-10-15”],
“日期时间”:[09:53:56”,“10:53:56”,“09:23:56”,“11:53:56”,“11:23:56”,“10:33:56”,“12:53:56”,“12:23:56”,“09:53:56])
df
代工日期时间EnNo
0   2019-10-12  09:53:56    2
1   2019-10-13  10:53:56    2
2   2019-10-14  09:23:56    2
3   2019-10-15  11:53:56    2
4   2019-10-16  11:23:56    2
5   2019-10-12  10:33:56    3
6   2019-10-13  12:53:56    3
7   2019-10-14  12:23:56    3
8   2019-10-15  09:53:56    3
导入日期时间
df['DateTime']=pd.to_DateTime(df['DateTime']).dt.time#转换为DateTime
定义时间范围(行):#我只写了两个条件-添加更多
i=行['DateTime']
如果idatetime.time(9,30,0):
返回“9:30-10:30”
如果idatetime.time(10,30,0):
返回“10:30-11:00”
其他:
返回“大于11:00”
df['time range']=df.apply(时间范围,轴=1)
df1=pd.concat([df['EnNo','DaiGong','DateTime']],pd.get_假人(df['time range']),axis=1)
df1
恩诺代工日期时间10:30-11:00 9:30-10:30大于11:00
0   2   2019-10-12  09:53:56    0   1   0
1   2   2019-10-13  10:53:56    1   0   0
2   2   2019-10-14  09:23:56    0   0   1
3   2   2019-10-15  11:53:56    0   0   1
4   2   2019-10-16  11:23:56    0   0   1
5   3   2019-10-12  10:33:56    1   0   0
6   3   2019-10-13  12:53:56    0   0   1
7   3   2019-10-14  12:23:56    0   0   1
8   3   2019-10-15  09:53:56    0   1   0
要按员工获取计数总和,
df1.groupby(['EnNo'],as_index=False).sum()
如果您对我的测试数据有任何疑问,请告诉我:

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           -           -           -           -      -

我没有看过你的代码,但输出似乎是正确的,对吗?先生,我想在任何员工输入的任何时间,都应该添加到该时间段列中。。如果员工ID 4在9:30到10:30之间输入,则该计数应存储在列中(按日期)。请帮助,先生,我有总的员工id 2到14(例如E id-2,3,4,5,6,7,8,9,10,11,12,13,14)。我希望如果有任何员工在9:30-10:30左右的其他时段上班。。所以我只想在员工输入的每个特定日期计算。所以在这里插入时间间隔的总计数。。。先生,我是新来的,所以请帮助。@SauravMishra在endSir更新答案,我得到了这个。。。非常感谢先生给我你的好久。