19 位时间戳转换
19 Digit Timestamp Conversion
我有一组 19 位的时间戳,stamp
,我不知道如何将其转换为日期时间格式。
- 对比一下,
stamp
对应dt
.
- 在以下代码中,
dt
已转换为日期时间和 unix 时间戳。
我读过类似的 SO 帖子,这不仅仅是除以 1,000,000,000 的问题。此外,它 似乎 不像 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 进行转换的想法?
- Converting unix timestamp string to readable date 没有解决问题,因为它没有将
stamp
转换为相应的 dt
.
时间戳格式一致但毫无意义。通过执行 (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 月上旬。我不知道具有这些属性的任何常见或众所周知的时间戳,但这些信息足以让您能够任意转换往返的次数。
很好地解释了解决问题的步骤。但答案缺少细节和代码,所以我想我会为您填写。
如果时间戳数字与 date/time 之间存在线性关系,则只需对每个样本取两个样本即可建立关系。拥有更多的东西可以测试解决方案并确信关系确实是线性的。
>>> 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
如您所见,函数输出与预期结果非常接近。它与第一个和最后一个完全匹配,因为它们是用于计算转换因子的两个。
我有一组 19 位的时间戳,stamp
,我不知道如何将其转换为日期时间格式。
- 对比一下,
stamp
对应dt
. - 在以下代码中,
dt
已转换为日期时间和 unix 时间戳。
我读过类似的 SO 帖子,这不仅仅是除以 1,000,000,000 的问题。此外,它 似乎 不像 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 进行转换的想法?
- Converting unix timestamp string to readable date 没有解决问题,因为它没有将
stamp
转换为相应的dt
.
时间戳格式一致但毫无意义。通过执行 (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 月上旬。我不知道具有这些属性的任何常见或众所周知的时间戳,但这些信息足以让您能够任意转换往返的次数。
如果时间戳数字与 date/time 之间存在线性关系,则只需对每个样本取两个样本即可建立关系。拥有更多的东西可以测试解决方案并确信关系确实是线性的。
>>> 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
如您所见,函数输出与预期结果非常接近。它与第一个和最后一个完全匹配,因为它们是用于计算转换因子的两个。