19位数时间戳转换

问题描述 投票:0回答:1

我有一组19位数的时间戳。stamp我不知道如何转换为日期时间格式。

  • 比较而言: stamp 相当于 dt.
  • 在以下代码中: dt 已经转换为datetime和unix时间戳。

我看了类似的SO帖子,这不仅仅是除以1000000000的问题。此外,它不 似乎 是一个双重问题,如从 如何将一个很长的时间戳转换为日期时间(19位) (9876432101234567890).

例子。

import pandas as pd

data = {'stamp': [1264604283246383104, 1266445459956158467, 1269744490329358337, 1270363071710715905],
        'dt': ['May 24 2020 13:08 EST', 'May 29 2020 15:05 EST', 'Jun 7 2020 17:34 EST', 'Jun 9 2020 10:32 EST']}

df = pd.DataFrame(data)

# move timezone to a separate column
df['tz'] = df['dt'].str[-4:]
df['dt'] = df['dt'].str.replace(' EST', '')

# convert dt to UTC datetime
df['datetime'] = pd.to_datetime(df['dt']).dt.tz_localize(tz='US/Eastern').dt.tz_convert('UTC')

# convert datetime to unix datetime
df['datetime_unix'] = df['datetime'].astype(int)

                 stamp                 dt    tz                  datetime        datetime_unix
0  1264604283246383104  May 24 2020 13:08   EST 2020-05-24 17:08:00+00:00  1590340080000000000
1  1266445459956158467  May 29 2020 15:05   EST 2020-05-29 19:05:00+00:00  1590779100000000000
2  1269744490329358337   Jun 7 2020 17:34   EST 2020-06-07 21:34:00+00:00  1591565640000000000
3  1270363071710715905   Jun 9 2020 10:32   EST 2020-06-09 14:32:00+00:00  1591713120000000000

关于这是什么以及如何通过Python转换的想法?

python datetime time posix epoch
1个回答
4
投票

那个时间戳格式是一致的,但是无厘头。通过做 (1270363071710715905 - 1264604283246383104)/(Jun 9 2020 10:32 EST - May 24 2020 13:08 EST)我们确定您的时间戳以大约4.2GHz的速度跳动。然后通过 Jun 9 2020 10:32 EST - 1270363071710715905/4.2GHz我们确定你的时间戳的年代是在2010年11月初。我不知道有什么常见的或知名的时间戳具有这些属性,但这些信息足以让你能够将任意时间转换为它。


3
投票

Joseph Sible-恢复莫妮卡 很好的解释了解决你问题的步骤。 但是答案中缺少具体的内容和代码,所以我想我可以帮你补上。

如果时间戳数字和datetime之间存在线性关系,只需要每个样本的两个样本就可以建立关系。 如你所做的更多,就有可能测试解决方案,并确信这种关系真的是线性的。

>>> import datetime as dt
>>> date_list=[(1264604283246383104, dt.datetime(2020,5,24, 13,8)),
               (1266445459956158467, dt.datetime(2020,5,29, 15,5)),
               (1269744490329358337, dt.datetime(2020,6,7, 17,34)),
               (1270363071710715905, dt.datetime(2020,6,9, 10,32))]
>>> freq = (date_list[-1][0] - date_list[0][0]) / (date_list[-1][1] - date_list[0][1]).total_seconds()
>>> freq
4194188417.185807
>>> epoch = date_list[0][1] - dt.timedelta(seconds=date_list[0][0] / freq)
>>> epoch
datetime.datetime(2010, 11, 3, 19, 23, 34, 828853)
>>> def stamp_to_dt(stamp):
    return epoch + dt.timedelta(seconds=stamp/freq)

>>> for stamp, date in date_list:
    print(stamp, date, stamp_to_dt(stamp))

1264604283246383104 2020-05-24 13:08:00 2020-05-24 13:08:00
1266445459956158467 2020-05-29 15:05:00 2020-05-29 15:04:22.832110
1269744490329358337 2020-06-07 17:34:00 2020-06-07 17:33:54.641731
1270363071710715905 2020-06-09 10:32:00 2020-06-09 10:32:00

正如你所看到的,函数输出与预期的结果非常吻合。 它与第一个和最后一个完全匹配,因为这两个是用来计算转换因子的。

© www.soinside.com 2019 - 2024. All rights reserved.