Необходимо рассчитать разницу во времени между временными метками и сохранить ее в переменной

1

Я начинающий с питоном, и поэтому мои вопросы могут встречаться как тривиальные. Я был бы признателен за вашу поддержку или любые причины моей проблемы.

Проблема:

Существует около 10 различных состояний; Порядок перемещается в разных состояниях, и при завершении состояния создается метка времени. Например, ниже, Есть четыре состояния A, B, C, D.

A 10 AM
B  1 PM
C  4 Pm
D  5 PM

Время, проведенное в B = 1PM -10AM = 3.

Несколько раз одно и то же состояние может происходить несколько раз. Следовательно, нам нужна переменная для сохранения значения разности во времени для одного состояния

К настоящему времени добавлены исходные данные csv и мой код. Существует несколько заказов, для которых этот расчет необходимо выполнить. однако для простоты у меня есть данные только для одного порядка.

Пример данных:

Order   States  modified_at
1   Resolved    2018-06-18T15:05:52.2460000
1   Edited      2018-05-24T21:44:07.9030000
1   Pending PO Creation 2018-06-06T19:52:51.5990000
1   Assigned    2018-05-24T17:46:03.2090000
1   Edited      2018-06-04T15:02:57.5130000
1   Draft       2018-05-24T17:45:07.9960000
1   PO Placed   2018-06-06T20:49:37.6540000
1   Edited      2018-06-04T11:18:13.9830000
1   Edited      2018-05-24T17:45:39.4680000
1   Pending Approval    2018-05-24T21:48:23.9180000
1   Edited      2018-06-06T21:00:19.6350000
1   Submitted   2018-05-24T21:44:37.8830000
1   Edited      2018-05-30T11:19:36.5460000
1   Edited      2018-05-25T11:16:07.9690000
1   Edited      2018-05-24T21:43:35.0770000
1   Assigned    2018-06-07T18:39:00.2580000
1   Pending Review  2018-05-24T17:45:10.5980000
1   Pending PO Submission   2018-06-06T14:16:26.6580000

Код, который я пробовал:

import pandas as pd
import datetime as datetime
from dateutil.relativedelta import relativedelta

fileName = "SamplePR.csv"

df = pd.read_csv(fileName, delimiter=',')

df['modified_at'] = pd.to_datetime(df.modified_at)

df = df.sort_values(by='modified_at')
df = df.reset_index(drop=True)

df1  = df[:-1]
df2 = df[1:]

dfm1 = df1['modified_at']
dfm2 = df2['modified_at']

dfm1 = dfm1.reset_index(drop=True)
dfm2 = dfm2.reset_index(drop=True)

for i in range(len(df)-1):
    start = datetime.datetime.strptime(str(dfm1[i]), '%Y-%m-%d %H:%M:%S')
    ends  = datetime.datetime.strptime(str(dfm2[i]), '%Y-%m-%d %H:%M:%S')
    diff = relativedelta(ends, start)
    print (diff)

До сих пор я пытался сортировать список по времени, а затем вычислять разницу между двумя состояниями. Было бы очень полезно, если кто-то может помочь с логикой или указать в правильном направлении

Теги:
python-3.x

3 ответа

1

Добро пожаловать на визу, если вы намерены просто проверить разницу во времени между датой, используйте to_datetime, чтобы преобразовать в datestamp и разделить ее, сдвинув

index   Order   States  modified_at
0   0   1   Resolved    2018-06-18 15:05:52.246
1   1   1   Edited  2018-05-24 21:44:07.903
2   0   1   Edited  2018-06-06 21:00:19.635
3   1   1   Submitted   2018-05-24 21:44:37.883
4   2   1   Edited  2018-05-30 11:19:36.546
5   3   1   Edited  2018-05-25 11:16:07.969
6   4   1   Edited  2018-05-24 21:43:35.077
7   5   1   Assigned    2018-06-07 18:39:00.258

df.modified_at = pd.to_datetime(df.modified_at)
df['time_spent'] = df.modified_at - df.modified_at.shift()

Из:

0                         NaT
1   -25 days +06:38:15.657000
2     12 days 23:16:11.732000
3   -13 days +00:44:18.248000
4      5 days 13:34:58.663000
5    -6 days +23:56:31.423000
6    -1 days +10:27:27.108000
7     13 days 20:55:25.181000
Name: modified_at, dtype: timedelta64[ns]

вы можете использовать сводную таблицу для вашего требования

df.time_spent = df.time_spent.dt.seconds
pd.pivot_table(df,values='time_spent',index=['Order'],columns=['States'],aggfunc=np.sum)

Из:

States  Assigned    Edited  Resolved    Submitted
Order               
0         NaN    83771.0    0.0      NaN
1         NaN    23895.0    NaN      2658.0
2         NaN    48898.0    NaN      NaN
3         NaN    86191.0    NaN      NaN
4         NaN    37647.0    NaN      NaN
5      75325.0      NaN     NaN      NaN
  • 0
    Спасибо за ответ, Нага. Это помогает как хорошее начало. Конечная цель - найти общее время. Однако есть состояния, которые повторяются. Например, если есть состояния ABCDACAEB; Выходные данные должны содержать только ABCDE с общими временными метками. Пожалуйста, проверьте этот файл 'Sampleinputoutput' здесь - drive.google.com/open?id=15lBHI-TA0zLWfYcjb54hJkxjn0xv-XWx ; Пожалуйста, обратите внимание, что состояния всегда перемешаны и должны быть отсортированы сначала по временным отметкам. Это то, с чем вы можете помочь? Спасибо
  • 0
    Привет @Visal Я только что отредактировал код для вашего требования, вы можете использовать таблицу Picvot для такой операции
1

Вы можете использовать diff от pandas чтобы получить разницу между двумя строками

Вот пример кода.

In [1]: import pandas as pd
In [2]: from io import StringIO

In [3]: data = StringIO('''Order,States,modified_at
   ...: 1,Resolved,2018-06-18T15:05:52.2460000
   ...: 1,Edited,2018-05-24T21:44:07.9030000
   ...: 1,Pending PO Creation,2018-06-06T19:52:51.5990000
   ...: ''')

In [4]: df = pd.read_csv(data, sep=',')
In [5]: df['modified_at'] = pd.to_datetime(df['modified_at']) #convert the type to datetime
In [6]: df
Out[6]:
   Order               States             modified_at
0      1             Resolved 2018-06-18 15:05:52.246
1      1               Edited 2018-05-24 21:44:07.903
2      1  Pending PO Creation 2018-06-06 19:52:51.599

In [7]: df['diff'] = df['modified_at'].diff() #get the diff and add to a new column    
In [8]: df
Out[8]:
   Order               States             modified_at                      diff
0      1             Resolved 2018-06-18 15:05:52.246                       NaT
1      1               Edited 2018-05-24 21:44:07.903 -25 days +06:38:15.657000
2      1  Pending PO Creation 2018-06-06 19:52:51.599   12 days 22:08:43.696000
  • 0
    Спасибо за ответ, Правин. Это помогает.
  • 0
    Спасибо за ответ, Правин. Это помогает. Конечная цель - найти общее время. Однако есть состояния, которые повторяются. Например, если есть состояния ABCDACAEB; Выходные данные должны содержать только ABCDE с общими временными метками. Пожалуйста, проверьте этот файл 'Sampleinputoutput' здесь - drive.google.com/open?id=15lBHI-TA0zLWfYcjb54hJkxjn0xv-XWx ; Пожалуйста, обратите внимание, что состояния всегда перемешаны и должны быть отсортированы по отметкам времени, спасибо
-1

$datetime1 = new DateTime('2016-11-30 03:55:06');//start time $datetime2 = new DateTime('2016-11-30 11:55:06');//end time $interval = $datetime1->diff($datetime2); echo $interval->format('%Y years %m months %d days %H hours %i minutes %s seconds');//00 years 0 months 0 days 08 hours 0 minutes 0 seconds

Ещё вопросы

Сообщество Overcoder
Наверх
Меню