【问题标题】:Finding time difference between the message status in python在python中查找消息状态之间的时间差
【发布时间】:2021-03-20 09:42:17
【问题描述】:

所以,我想计算时间差;文件看起来像这样

id message_id send_date status
0 5f74b996a2b7e 2020-10-01 00:00:07 sent
1 5f74b996a2b7e 2020-10-01 00:00:09 delivered
2 5f74b99e85b3c 2020-10-02 02:00:14 sent
3 5f74b99e85b3c 2020-10-02 02:01:16 delivered
4 5f74b99e85b3c 2020-10-02 08:06:49 read
5 5f74b996a2b7e 2020-10-02 15:16:32 read
6 5f9d97ff1af9e 2020-10-14 13:45:43 sent
7 5f9d97ff1af9e 2020-10-14 13:45:45 delivered
8 5f9d97ff1af9e 2020-10-14 13:50:48 read
9 5f74b9a35b6c5 2020-10-16 19:01:19 sent
10 5f74b9a35b6c5 2020-10-16 19:01:25 deleted

里面是递增的id,message_id是每条消息唯一的,send_date是时间,status是消息状态(有5个状态:send、delivered、read、failed、deleted)。

我想计算消息发送然后传递的时间差,如果传递然后读取。

我知道这样的东西很方便,但我不确定如何将它唯一地分配给每个 message_id

from datetime import datetime
s1 = '2020-10-14 13:45:45'
s2 = '2020-10-14 13:50:48' # for example
FMT = '%Y-%m-%d %H:%M:%S'
tdelta = datetime.strptime(s2, FMT) - datetime.strptime(s1, FMT)
print(tdelta)

Ref: https://stackoverflow.com/questions/3096953/how-to-calculate-the-time-interval-between-two-time-strings

预期的输出是,

message_id delivered_diff read_diff deleted_diff
0 5f74b996a2b7e 00:00:02 1 day, 15:16:23
1 5f74b99e85b3c 00:01:02 6:05:33
2 5f9d97ff1af9e 00:00:02 0:05:03
3 5f74b9a35b6c5 0:00:06

【问题讨论】:

  • 你能分享你的代码和预期的输出吗?
  • 我已经包含了一些需要澄清的内容。谢谢!

标签: python-3.x time


【解决方案1】:

您可以使用pandasdatetime 来执行此操作。 对代码进行了注释,以便更好地理解和使用python 3.8实现。

import datetime
import pandas as pd

def time_delta(a, b):
    return datetime.datetime.strptime(b, '%Y-%m-%d %H:%M:%S') - datetime.datetime.strptime(a, '%Y-%m-%d %H:%M:%S') # calculate the timedelta

def calculate_diff(val, first_status, second_status):
    if not val['status'].str.contains(first_status).any() or not val['status'].str.contains(second_status).any(): # Check if the status exist
        return ''

    a = val.loc[val['status'] == first_status, 'send_date'].values[0] # Get the first send_date value for the first status value
    b = val.loc[val['status'] == second_status, 'send_date'].values[0] # Get the first send_date value for the second status value

    return time_delta(a, b) # calculate the delta

df = pd.read_csv('test.csv', sep=';') # Load csv file with ; as separator
grouped = df.groupby('message_id') # Group by message ids

final_df = pd.DataFrame(columns=['message_id', 'delivered_diff', 'read_diff', 'deleted_diff']) # create empty result dataframe
for message_id, values in grouped: # calculate the results for each group
    delivered_diff = calculate_diff(values, 'sent', 'delivered') # calculate delivered_diff as delta between sent status and delivered status
    read_diff = calculate_diff(values, 'delivered', 'read') # calculate read_diff as delta between delivered status and read status
    deleted_diff = calculate_diff(values, 'sent', 'deleted') # calculate deleted_diff as delta between sent status and deleted status

    res = {
        'message_id': message_id,
        'delivered_diff': delivered_diff,
        'read_diff': read_diff,
        'deleted_diff': deleted_diff
    }
    # append the results
    final_df = final_df.append(res, ignore_index=True)

# print final result
print(final_df)

结果:

      message_id   delivered_diff        read_diff     deleted_diff
0  5f74b996a2b7e  0 days 00:00:02  1 days 15:16:23
1  5f74b99e85b3c  0 days 00:01:02  0 days 06:05:33
2  5f74b9a35b6c5                                    0 days 00:00:06
3  5f9d97ff1af9e  0 days 00:00:02  0 days 00:05:03

【讨论】:

  • 这太棒了!非常感谢! (Y)
  • 嗨@RahmanArmenzaria 如果这个或任何答案已经解决了您的问题,请考虑通过单击复选标记接受它。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做,也可以查看this了解更多详情。
【解决方案2】:
import pandas as pd
from datetime import datetime, timedelta

final_dict = []
data = pd.read_csv('data.csv', names=['id','unique_id','time','status'])
data['time'] = pd.to_datetime(data['time'])
# data.info()
groupByUniqueId = data.groupby('unique_id') 
for name,group in groupByUniqueId:
  for row in group.iterrows():
        
    if row[1][3] == "sent":
      sent = row[1][2]
    if row[1][3] == "read":
      final_dict.append({row[1][1]: {"read": str(sent - row[1][2])}})
    elif row[1][3] == "delivered":
      final_dict.append({row[1][1]: {"delivered":str(sent - row[1][2])}})
    elif row[1][3] == "deleted":
      final_dict.append({row[1][1]: {"deleted":str(sent - row[1][2])}})

print(final_dict)

CSV 数据样本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2015-04-16
    • 2018-10-08
    相关资源
    最近更新 更多