19位时间戳转换

2024-04-19 18:05:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  • 为了进行比较,stamp对应于dt
  • 在下面的代码中,dt已转换为datetime和unix时间戳

我也读过类似的文章,这不仅仅是除以100000000的问题。而且,它不像How to convert a really long timestamp into datetime (19 digits) (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转换的想法


Tags: toconvertdfdatadatetimestamp时间dt
2条回答

Joseph Sible-Reinstate Monica在解释解决问题的步骤方面做得很好。但答案是缺少细节和代码,所以我想我会帮你填写

如果时间戳编号与日期/时间之间存在线性关系,则只需对每个编号进行两次采样即可建立关系。有了更多,你就有可能测试解决方案,并确信这种关系确实是线性的

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

如您所见,函数输出与预期结果非常接近。它精确地匹配第一个和最后一个,因为这两个是用来计算转换因子的

时间戳格式是一致的,但毫无意义。通过执行(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月初。我不知道有任何具有这些属性的常见或众所周知的时间戳,但这些信息足以让您能够将任意时间转换为这些时间戳

相关问题 更多 >