我有一个带有时间戳字段“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 函数都没有帮助我。我想我可能必须对每个时间戳应用一个 lambda 函数,并使用一些 if_else() 逻辑来读取偏移量,如果偏移量低于 12,则将其设为 12,如果偏移量大于 14,则将其设为 12将其设置为 14。
假设我的数据帧称为“pages”,我的时间戳列称为“dimension3”,我该如何做到这一点?
也欢迎其他更优雅的解决方案。
最佳答案
我在 lambda 中使用了带有 try except 的自定义函数:
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))
关于python - 将 lambda 函数应用于时间戳以调整无意义的偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59346373/