首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用python根据特定时间范围过滤API响应数据

如何使用python根据特定时间范围过滤API响应数据
EN

Stack Overflow用户
提问于 2022-02-23 07:49:05
回答 3查看 641关注 0票数 1

我使用一个lambda python函数来使用mailgun日志API从mailgun获取电子邮件日志。这是我的功能,

代码语言:javascript
复制
import json
import requests
resp = requests.get("https://api.eu.mailgun.net/v3/domain/events",
                    auth=("api","key-api"))
def jprint(obj):
    # create a formatted string of the Python JSON object
    text = json.dumps(obj, sort_keys=True, indent=4)
    print(text)
jprint(resp.json())

此函数提供从mailgun API获取的电子邮件日志的格式化json输出。

来自API的示例响应,

代码语言:javascript
复制
{
    "items": [
        {
            "campaigns": [],
            "delivery-status": {
                "attempt-no": 1,
                "certificate-verified": true,
                "code": 250,
                "description": "",
                "message": "OK",
                "mx-host": "host",
                "session-seconds": 1.5093050003051758,
                "tls": true
            },
            "envelope": {
                "sender": "postmaster@domain.com",
                "sending-ip": "ip",
                "targets": "id@mail.com",
                "transport": "smtp"
            },
            "event": "delivered",
            "flags": {
                "is-authenticated": true,
                "is-routed": false,
                "is-system-test": false,
                "is-test-mode": false
            },
            "id": "id",
            "log-level": "info",
            "message": {
                "attachments": [],
                "headers": {
                    "from": "NAME <noreply@name.com>",
                    "message-id": "20220223075827.de300265fad746e9@domain.com",
                    "subject": "Client due diligence information has been submitted by one of your customers.",
                    "to": "id@mail.com"
                },
                "size": 1990
            },
            "recipient": "id@mail.com",
            "recipient-domain": "domain.com",
            "storage": {
                "key": "key",
                "url": "https://storage.eu.mailgun.net/v3/domains/domain/messages/id"
            },
            "tags": [],
            "timestamp": 1645603109.434181,
            "user-variables": {}
        },
        {
            "envelope": {
                "sender": "postmaster@domain.com",
                "targets": "id@mail.com.com",
                "transport": "smtp"
            },
            "event": "accepted",
            "flags": {
                "is-authenticated": true,
                "is-test-mode": false
            },
            "id": "id",
            "log-level": "info",
            "message": {
                "headers": {
                    "from": "NAME <noreply@name.com>",
                    "message-id": "20220223075827.de300265fad746e9@domain.com",
                    "subject": "Client due diligence information has been submitted by one of your customers.",
                    "to": "id@mail.com.com"
                },
                "size": 1990
            },
            "method": "HTTP",
            "recipient": "id@mail.com",
            "recipient-domain": "domain",
            "storage": {
                "key": "key",
                "url": "https://storage.eu.mailgun.net/v3/domains/domain/messages/key"
            },
            "tags": null,
            "timestamp": 1645603107.282775,
            "user-variables": {}
        },

在这里,时间戳不是人类可读的。

我需要设置aws lambda python脚本来触发事件,定期调用mailgun并将日志发送到cloudwatch。我熟悉设置,但不熟悉脚本。

现在,我只需要在最后一个小时内动态地过滤API数据。

通过使用熊猫库的分析,这是可以实现的,但我无法得到正确的答案来定期获取动态时间范围内的日志。

关于这一点,我参考了很多文档,但是我找不到合适的答案,而且python对我来说也是全新的。

有人能指点我如何动态地从最后的N个时间范围内得到日志吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-02-23 08:39:23

除了上述答案之外,对于仅使用python的两个时间范围和日期范围之间的筛选,您可以使用datetime。这里使用与@Amirhossein Kiani相同的列表理解。

代码语言:javascript
复制
import datetime

start = datetime.datetime(year, month, day, hour, minute, second).timestamp()
stop = datetime.datetime(year, month, day, hour, minute, second).timestamp()

[x for x in data["items"] if start < x["timestamp"] < stop]

对于一个小时的差异,您还可以使用timedelta:

代码语言:javascript
复制
start = (datetime.datetime.now() - datetime.timedelta(hours=1)).timestamp()
stop = datetime.datetime.now().timestamp()
票数 1
EN

Stack Overflow用户

发布于 2022-02-23 08:01:20

梅尔贡的文档中,您可以指定一个定时器,这样就可以使用beginend 参数过滤结果。

在此之后,您可以使用pd.json_normalize重塑您的json响应。

票数 0
EN

Stack Overflow用户

发布于 2022-02-23 08:23:39

除了我个人更喜欢的关于文档的@Corr外星人所说的内容之外,您还可以使用纯python方法使用列表理解来重新获取最后一个小时的数据。在下面的代码中,我将假设您将API的响应命名为data,应该是字典:

代码语言:javascript
复制
from time import time
lastHour = time() - 3600
[x for x in data["items"] if x["timestamp"] > lastHour]

这将使用大于最后一个小时(time() - 3600)的时间戳过滤值。

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

https://stackoverflow.com/questions/71233060

复制
相关文章

相似问题

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