我有一个python列表,用于存储在同一电子邮件线程中接收的电子邮件和发送的电子邮件的数据。收到的电子邮件标记为Email-In
,发送的电子邮件标记为Email-Out
。每个Email-In
或Email-Out
为电子邮件线程和时间戳分配了特定的requestID
。
例如,对于具有requestId
= 735482556的电子邮件线程,在2020年5月15日晚上11:15:52有传入的电子邮件:
[735482556, 'Email-In', '15-May-2020 11:15:52']
我的correspondence_list
上的值每天都会更改,并显示不同requestID的数据,因为此脚本每天都会扫描我的数据。
我当前的correspondence_list
:
[[735482556, 'Email-In', '15-May-2020 11:15:52'], [735482556, 'Email-Out', '15-May-2020 22:42:50'], [735482556, 'Email-In', '16-May-2020 11:58:41'], [735532797, 'Email-In', '16-May-2020 07:44:15'], [66789544, 'Email-In', '16-May-2020 10:44:15'], [66789544, 'Email-Out', '17-May-2020 11:44:15'], [66789544, 'Email-In', '17-May-2020 13:44:15'], [66789544, 'Email-Out', '17-May-2020 15:44:15'], [567432221, 'Email-In', '16-May-2020 20:30:15'], [567432221, 'Email-In', '16-May-2020 20:35:15'], [567432221, 'Email-Out', '16-May-2020 20:45:15']]
我正在尝试使用上面的列表来计算Email-In和Email-Out的时间差异,以查看回复传入电子邮件需要多少时间。每个requestId可以有多封电子邮件进/出,具体取决于请求收到了多少回复。
例如,requestId
= 735482556有3个项目。在这种情况下,我需要计算Email-In
和Email-Out
之间的时间差,即“ 11:26:58”,并忽略在'Email-In'
上发送的第二个'16-May-2020 11:58:41'
,因为没有与之配对的Email-Out 。
[735482556, 'Email-In', '15-May-2020 11:15:52'], [735482556, 'Email-Out', '15-May-2020 22:42:50'], [735482556, 'Email-In', '16-May-2020 11:58:41']
我当前的correspondence_list
的所需输出:
[[735482556, '11:26:58'], [735532797, 'not replied'], [66789544, '15:00:00', '02:15:00'], [567432221, '0:15:00']
到目前为止我的代码:
from datetime import datetime
s1 = '15-May-2020 11:15:52'
s2 = '15-May-2020 22:42:50'
FMT = '%d-%b-%Y %H:%M:%S'
tdelta = datetime.strptime(s2, FMT) - datetime.strptime(s1, FMT)
def format_timedelta(tdelta):
minutes, seconds = divmod(tdelta.seconds + tdelta.days * 86400, 60)
hours, minutes = divmod(minutes, 60)
return '{:d}:{:02d}:{:02d}'.format(hours, minutes, seconds)
myDifference = format_timedelta(tdelta)
上面的代码允许我为每个实例手动计算时差。但是,我试图了解如何在列表中进行迭代,并在列表中进行计算,如果线程中没有电子邮件输入和电子邮件输出对,则忽略计算。有人可以帮忙吗?提前致谢!
您想找到所有匹配项。我将假设requestID
是唯一的,并且没有重复的传出电子邮件。换句话说,每个ID只有一对外向传入电子邮件。
在这种情况下,您有几个选择。
例如,您可以在列表上循环两次,并检查ID和传入的邮件。
for ID, email, time in correspondence_list:
if email.endswith("In"):
for ID_2, email_2, time_2 in correspondence_list:
if email_2.endswith("Out") and ID == ID_2:
# calculate time
或者您尝试从一开始就匹配它们。
sorted_correspondence = dict()
for ID, email, time in correspondence_list:
sorted_correspondence.get(ID, []).append(time)
现在您可以循环访问字典,并且值应该是您的两个时间戳。如果只有1个值,则可以通过不处理来得出尚无答案的结论,并跳过它们。
刚刚注意到您要检查多个传入和传出电子邮件。在这种情况下,您可以使用字典方法,也可以向其中添加电子邮件数据。在这种情况下,您必须检查哪些进出。万一总是有一个传出和一个传入,您可以更改值以匹配它们。如果有多个传入电子邮件或多个外发电子邮件,您可以尝试为所有外发电子邮件创建堆栈,并按传入的电子邮件弹出它们。但是,最后的动作实际上取决于回复如何与传入的电子邮件匹配。
为了简化计算传入和传出电子邮件之间的时间差的过程,您应该准备一个数据结构。
我认为这是一本字典,其中包含RequestID
下的所有电子邮件。
correspondence_list = [
[735482556, 'Email-In', '15-May-2020 11:15:52'],
[735482556, 'Email-Out', '15-May-2020 22:42:50'],
[735482556, 'Email-In', '16-May-2020 11:58:41'],
[735532797, 'Email-In', '16-May-2020 07:44:15'],
[66789544, 'Email-In', '16-May-2020 10:44:15'],
[66789544, 'Email-Out', '17-May-2020 11:44:15'],
[66789544, 'Email-In', '17-May-2020 13:44:15'],
[66789544, 'Email-Out', '17-May-2020 15:44:15'],
[567432221, 'Email-In', '16-May-2020 20:30:15'],
[567432221, 'Email-In', '16-May-2020 20:35:15'],
[567432221, 'Email-Out', '16-May-2020 20:45:15']
]
# Calculatiing unique `RequestIDs`
request_ids = set([i[0] for i in correspondence_list])
# {66789544, 567432221, 735482556, 735532797}
mail_dict = {request_id: [(ce[1], ce[2]) for ce in c if ce[0]==request_id] for requrest_id in request_ids}
{ 66789544: [ ('Email-In', '16-May-2020 10:44:15'),
('Email-Out', '17-May-2020 11:44:15'),
('Email-In', '17-May-2020 13:44:15'),
('Email-Out', '17-May-2020 15:44:15')],
567432221: [ ('Email-In', '16-May-2020 20:30:15'),
('Email-In', '16-May-2020 20:35:15'),
('Email-Out', '16-May-2020 20:45:15')],
735482556: [ ('Email-In', '15-May-2020 11:15:52'),
('Email-Out', '15-May-2020 22:42:50'),
('Email-In', '16-May-2020 11:58:41')],
735532797: [('Email-In', '16-May-2020 07:44:15')]}
具有此功能,处理电子邮件并发现它们之间的时间差异或者根本没有得到答复应该没什么大不了的。