将 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))
我有一个带有时间戳字段 '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))