将 lambda 函数应用于时间戳以调整无意义的偏移量

Apply a lambda function to timestamp to adjust nonsensical offset

我有一个带有时间戳字段 'dimension3' 的数据帧 'pages'。 dimension3 应该是 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 post and this one 上的回复,看看是否有一些开箱即用的解决方案来解决这些越界时区偏移。

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

假设我的数据框称为页面,我的时间戳列称为维度 3,我该怎么做?

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

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

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))