【问题标题】:Apply a lambda function to timestamp to adjust nonsensical offset将 lambda 函数应用于时间戳以调整无意义的偏移量
【发布时间】:2020-04-08 07:28:30
【问题描述】:

我有一个带有时间戳字段“dimension3”的数据框“pages”。维度 3 应该是 ISO 时间,但有一些无意义的偏移会导致问题。

数据框是来自世界各地访问者的网站综合浏览量,因此每一行都有自己的时间戳和时区偏移量。

ISO 时间的偏移量应在 -12 和 +14 范围内。

我的大部分时间戳都在这个范围内。这是一个示例声音数据点:

x = dateutil.parser.parse('2019-11-11T07:08:09.640-4:00')
x
datetime.datetime(2019, 11, 11, 7, 8, 9, 640000, tzinfo=tzoffset(None, -14400))

以下是我的数据框中出现的有问题的数据点的示例:

y = dateutil.parser.parse('2019-11-11T07:08:09.640-31:00')
y
datetime.datetime(2019, 11, 11, 7, 8, 9, 640000, tzinfo=tzoffset(None, -111600))

有问题的偏移量为 -31,大于 -12 的最小界限。

这是有问题的,因为当我尝试将这些数据发送到字段类型为 timestamptz 的 postgres 数据库时,我收到一条错误消息,指出由于某些数据点超出了可接受的范围,数据无法上传。

我花了一些时间查看this 帖子和this one 上的回复,看看是否有一些开箱即用的解决方案来解决这些超出时区偏移的问题。

各种软件包中提到的 iso 函数都没有帮助我。我在想我可能必须使用一些 if_else() 逻辑对每个时间戳应用 lambda 函数来读取偏移量,如果偏移量低于 12,则将其设为 12,如果偏移量大于 14,则只需将其设置为 14。

假设我的数据框称为 pages 并且我的时间戳列称为 dimension3,我该怎么做?

也欢迎其他更优雅的解决方案。

【问题讨论】:

  • 解决“上游”问题不是更有意义:首先防止生成这种无意义的时间戳。时区不仅与 UTC 时间不同:时区有时可以改变偏移量,因为一个国家可以决定改变它。
  • 我们无法从 API 中追溯替换数据,而且这超出了我将这些数据导入 Postgres 的当前任务范围。它也是极少数的数据点
  • 绝对后备选项是将字段转换为字符串,然后上传到 postgres 但我真的想避免这种情况
  • 我发现了这个转换为本地时区的例程,如果我们能弄清楚如何拉时区,它可能对你的工作有用:def utc_to_local(utc_dt): return utc_dt.replace(tzinfo= timezone.utc).astimezone(tz=None) 我还在研究这个,我也对答案感兴趣
  • 感谢您的帮助。我正在尝试找到一种方法来识别问题时间戳以将此函数应用于

标签: python pandas python-dateutil


【解决方案1】:

我在 lambda 中使用了 try 的自定义函数:

def rogue_tz_offsets(t):
    """
    try to convert to timestamp and if it fails remove timezone offset
    """
    t = dateutil.parser.parse(t)
    try:
        return t.isoformat()
    except:
        t = t.replace(tzinfo = None)
        return t.isoformat()

然后

pages['dimension3'] = pages['dimension3'].apply(lambda x: rogue_tz_offsets(x))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 2016-02-26
    • 2018-09-09
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多