Причина ошибки в том, что exit_t
не установлен в любом месте в l oop. Это пустая строка. Вы устанавливаете его до l oop на exit_t = ''
, но затем оно никогда не устанавливается снова Вот почему strptime
выдает ошибку здесь:
>>> datetime.strptime(' ', "%Y-%m-%d %H:%M:%S")
Traceback (most recent call last):
...
File "/usr/local/Cellar/python/3.7.6/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_strptime.py", line 359, in _strptime
(data_string, format))
ValueError: time data ' ' does not match format '%Y-%m-%d %H:%M:%S'
Решение состоит в том, чтобы просто установить его правильно на "tLL"
(если я вас правильно понимаю).
Но я бы хотел go далее и скажу, что я думаю, что вы делаете код намного намного более сложным, чем это должно быть. Насколько я понимаю, вы просто хотите вычислить продолжительность времени между "tPS"
(время на входе) и "tLL"
(время на выходе). Поскольку вы уже выполняете итерацию по каждой строке, вам просто нужно присвоить значения соответствующим образом
pid = row['pId']
enter_t_str = row['tPS'] # strings
exit_t_str = row['tLL'] # strings
, затем преобразовать строки datetime в объекты datetime, используя strptime
enter_t_dt = datetime.strptime(enter_t_str, "%Y-%m-%d %H:%M:%S")
exit_t_dt = datetime.strptime(exit_t_str, "%Y-%m-%d %H:%M:%S")
, а затем вычислить Продолжительность
duration = exit_t_dt - enter_t_dt
и, наконец, добавьте его в свой список
enter_exit_times.append([pid, enter_t_str, exit_t_str, duration.total_seconds()])
Нет необходимости отслеживать "pId"
.
Вот полный код:
stats = df.sort_values(by=['pId', 'tPS', 'tLL'])[['pId', 'tPS', 'tLL', 'dZ']]
pid = ''
enter_t = ''
exit_t = ''
enter_exit_times = []
for ind, row in stats.iterrows():
pid = row['pId']
enter_t_str = row['tPS']
exit_t_str = row['tLL']
enter_t_dt = datetime.strptime(enter_t_str, "%Y-%m-%d %H:%M:%S")
exit_t_dt = datetime.strptime(exit_t_str, "%Y-%m-%d %H:%M:%S")
duration = exit_t_dt - enter_t_dt
enter_exit_times.append([pid, enter_t_str, exit_t_str, duration.total_seconds()])
enter_exit_times_df = pd.DataFrame(enter_exit_times)
print(enter_exit_times_df)
И выходной DataFrame:
0 1 2 3
0 129 2019-12-02 15:04:09 2019-12-02 15:06:31 142.0
1 129 2019-12-02 15:04:15 2019-12-02 15:06:37 142.0
2 129 2019-12-02 15:05:15 2019-12-02 15:07:37 142.0
3 129 2019-12-02 15:05:18 2019-12-02 15:07:40 142.0
4 129 2019-12-02 15:05:24 2019-12-02 15:07:46 142.0
Если вы хотите получить время входа / выхода только для определенного периода времени дня, вы можете создать datetime
объекты для времени начала и окончания, а также регулярно сравнивать:
>>> dt_beg = datetime(2019,12,2,8,0,0) #8AM
>>> dt_beg
datetime.datetime(2019, 12, 2, 8, 0)
>>> dt_end = datetime(2019,12,2,10,0,0) #10AM
>>> dt_end
datetime.datetime(2019, 12, 2, 10, 0)
>>> dt = datetime(2019,12,2,9,34,0) #9:34AM
>>> dt_beg < dt < dt_end
True
>>> dt = datetime(2019,12,2,14,34,0) #2:34PM
>>> dt_beg < dt < dt_end
False
Таким образом, вы можете добавить фильтр для того, что добавить к enter_exit_times
:
if (enter_t_dt > start_dt and exit_t_dt < end_dt):
enter_exit_times.append(...)