首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何计算python列表项上的日期时间值

如何计算python列表项上的日期时间值
EN

Stack Overflow用户
提问于 2020-05-18 08:48:59
回答 4查看 56关注 0票数 1

我有一个python列表,用于存储在同一电子邮件线程中收到的电子邮件和发送的电子邮件的数据。收到的电子邮件被标记为Email-In,电子邮件被标记为Email-Out。每个Email-InEmail-Out都为电子邮件线程和时间戳指定了特定的requestID

例如,对于requestId = 735482556的电子邮件线程,在2005年5月15日-2020年11:15:52有收到的电子邮件:

代码语言:javascript
运行
复制
[735482556, 'Email-In', '15-May-2020 11:15:52'] 

我的correspondence_list上的值每天都会改变,并显示不同请求as的数据,因为这个脚本将每天扫描我的数据。

我现在的correspondence_list

代码语言:javascript
运行
复制
[[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']]

我试图用上面的列表来计算电子邮件输入和电子邮件输出的时间差异,以便查看回复收到的电子邮件所需的时间。每个requestId可以有多个电子邮件输入/输出,这取决于收到多少回复请求。

例如,requestId= 735482556有3个条目。在这种情况下,我需要计算Email-InEmail-Out之间的时间差,即'11:26:58‘,而忽略在'16-May-2020 11:58:41'上发送的第二个'Email-In',因为没有电子邮件与其配对。

代码语言:javascript
运行
复制
 [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的期望输出

代码语言:javascript
运行
复制
 [[735482556, '11:26:58'], [735532797, 'not replied'], [66789544, '15:00:00', '02:15:00'],  [567432221, '0:15:00']

到目前为止我的代码是:

代码语言:javascript
运行
复制
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)

上面的代码允许我手动计算每个实例的时间差。然而,我试图了解如何在我的列表中迭代它,并在列表中计算,如果没有电子邮件输入和电子邮件输出线程,则忽略计算。有人能帮忙吗?提前谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-05-18 09:37:37

您可以将correspondence_list转换为字典,然后可以找到在每个request_id中迭代的差异。

代码语言:javascript
运行
复制
from collections import defaultdict
from datetime import datetime

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_dict = defaultdict(list)
for email in correspondence_list:
    email_dict[email[0]].append(email[1:])

#sorting the lists based on time
for x in email_dict:
    email_dict[x] = sorted(email_dict[x], key = lambda x: datetime.strptime(x[1], '%d-%b-%Y %H:%M:%S'))

def days_between(d1, d2):
    tdelta = abs(datetime.strptime(d1, '%d-%b-%Y %H:%M:%S') - datetime.strptime(d2, '%d-%b-%Y %H:%M:%S'))
    minutes, seconds = divmod(tdelta.seconds + tdelta.days * 86400, 60)
    hours, minutes = divmod(minutes, 60) 
    return '{:d}:{:02d}:{:02d}'.format(hours, minutes, seconds)

correspondence_list = []
for request_id in email_dict:
    if len(email_dict[request_id]) == 1:
        correspondence_list.append([request_id, 'not replied'])
    else:
        idx, lst = 0, []
        while idx < len(email_dict[request_id]):
            z = email_dict[request_id][idx: idx + 2]
            if len(z) == 2 and sorted(z[0][0] + z[1][0]) == sorted('Email-In' + 'Email-Out'):
                lst.append(days_between(z[0][1], z[1][1]))
                idx += 2
            else:
                idx += 1
        correspondence_list.append([request_id] + lst)
print(correspondence_list)

输出:

代码语言:javascript
运行
复制
[[735482556, '11:26:58'],
 [735532797, 'not replied'],
 [66789544, '25:00:00', '2:00:00'],
 [567432221, '0:10:00']]
票数 1
EN

Stack Overflow用户

发布于 2020-05-18 09:03:22

你要做的是找到所有的匹配。我将假设requestID是唯一的,没有重复的发送电子邮件。换句话说,每个ID只有一对发送出去的电子邮件。

在这种情况下,您有几种选择。

例如,您可以循环列表两次,检查id和输入的传出消息。

代码语言:javascript
运行
复制
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

或者你试着从一开始就匹配他们。

代码语言:javascript
运行
复制
sorted_correspondence = dict()
for ID, email, time in correspondence_list:
    sorted_correspondence.get(ID, []).append(time)

现在,您可以遍历字典,并且值应该是您的两个时间戳。如果只有一个值,您可以得出结论,还没有答案,并跳过它们,通过不处理。

编辑

只是注意到你想要查看多封收发邮件。在这种情况下,您可以使用字典方法,并将电子邮件数据添加到其中。在这种情况下,您必须检查哪些是进出的。如果总是有一个传出值和一个传入值,您可以交替使用这些值来匹配它们。如果有多个电子邮件或多个输出的电子邮件,你可以尝试创建一个堆栈所有发送的电子邮件,并弹出他们每一个收到的电子邮件。但最后一项行动实际上取决于如何将回复与收到的电子邮件相匹配。

票数 0
EN

Stack Overflow用户

发布于 2020-05-18 09:17:57

为了简化收发电子邮件之间时间差的计算过程,您应该准备一个数据结构。

在我看来,最合适的是一本字典,里面有所有的电子邮件在他们的RequestID里。

代码语言:javascript
运行
复制
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 request_id in request_ids}

输出:

代码语言:javascript
运行
复制
{   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')]}

有了这一点,处理电子邮件,找出它们之间的时间差异,或者如果它们根本没有得到回复,这就不是什么大事了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61865776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档