这是啥日期时间格式以及如何解析它?

Posted

技术标签:

【中文标题】这是啥日期时间格式以及如何解析它?【英文标题】:What datetime format is this and how do I parse it?这是什么日期时间格式以及如何解析它? 【发布时间】:2019-01-31 07:57:57 【问题描述】:

我有一些从 API 中提取的数据,日期格式如下:'1522454400000'

不知道如何解析它,但这是我所拥有的(尝试失败)

df = DataFrame(test)
df.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']
df.set_index('Date')
df.index = pd.to_datetime(df.index, unit = 'd')

其中变量test 是基础数据的列表。这会错误地将数据解析为 1970 年。

解析结果:

1970-01-01 00:00:00.000000000

有什么想法吗?

********************** 编辑 ************************ ************

Python 版本:3

熊猫版。 0.23.0

这是一个可重复性的工作示例。但首先,这是我发现的事实。

日期格式:自 1970 年 1 月 1 日以来的 64 位 Unix 时间戳,以毫秒为单位

时区:UTC

我的时区:UTC + 4(所需的日期时间索引)

代码:

import bitmex
import pandas as pd
from pandas import DataFrame
import datetime
import ccxt

api_connector = ccxt.bitmex(
    'enableRateLimit': True
)

#get OHLCV Data
testdata = api_connector.fetch_ohlcv('XBTZ18', '1h')

df2 = DataFrame(testdata)
df2.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']
#df2.set_index('Date')
df2.index = pd.to_datetime(df2.Date, unit='ms')
df3 = df2.drop(['Date'],
              axis =1)
df3.tail()

这会返回:

Open    High    Low Close   Volume
Date                    
2018-07-06 00:00:00 6538.5  6555.0  6532.5  6537.0  176836
2018-07-06 01:00:00 6537.0  6535.5  6520.5  6524.5  139735
2018-07-06 02:00:00 6524.5  6542.5  6525.5  6542.5  59759
2018-07-06 03:00:00 6542.5  6545.0  6538.0  6538.0  121410
2018-07-06 04:00:00 6538.0  6538.5  6477.5  6525.0  764125

关闭!但没有雪茄。今天的日期是 2018 年 8 月 31 日,所以我至少希望它在正确的月份。

伙计们,我做错了什么?

【问题讨论】:

imo 1970 年的事情与 UNIX 系统上的时代(1970 年 1 月 1 日)有关。我的猜测是,解析中的错误只会给你时代,而不是之间的时间。来源:wiki.python.org/moin/WorkingWithTime 如果您知道 1970 年是不正确的,那么大概您知道什么是正确的,或者至少是大致的,所以您应该将这些信息放在问题中。因为您碰巧选择了最近的一个时间,格式非常接近我们中的一些人每天都必须盯着的熟悉的格式,并且正在寻找 UTC 午夜时间戳,所以您很幸运,我们中的一些人认出了它很快,但一般来说,你不应该那样依赖运气,否则你通常不会得到答案。 谢谢大家。我对时间框架有一种感觉,并且确实知道 1970 年已经过去了。我也知道这是一个每日时间序列(因为拉取数据的函数有一个参数)。但是我无法解析日期并将其设置为我的索引以及此处的响应。会继续努力 我不知道您的数据源是什么,但您确定 (a) 它设置了正确的日期,并且 (b) 它为您提供了当前数据? 【参考方案1】:

这几乎可以肯定是 "Unix time" 的一个变体:不是自 1970 年 1 月 1 日纪元以来的秒数,而是自 1970 年 1 月 1 日纪元以来的毫秒

>>> datetime.datetime.utcfromtimestamp(int('1522454400000') / 1000)
datetime.datetime(2018, 3, 31, 0, 0)

这看起来确实是一个合理的日期。它甚至看起来可能是 UTC,而不是当地时间(除非你恰好在英格兰,或者没想到它正好是在午夜)。


我认为 Pandas 的任何内置格式(实际上只是来自 datetime 和/或 dateutil 的格式的包装器)都不完全符合这一点,因此您可能需要按照我的方式进行操作做了 about(转换为 int 并将其视为一个数字)或执行字符串等效(砍掉最后 3 个字符,然后将其视为 UNIX 时间戳的字符串)。

第一个似乎更简单:

>>> pd.to_datetime(int('1522454400000'), unit='ms')
Timestamp('2018-03-31 00:00:00')

事实上,它甚至可以直接作用于字符串,隐式地进行转换:

>>> pd.to_datetime('1522454400000', unit='ms')
Timestamp('2018-03-31 00:00:00')

【讨论】:

很高兴知道它可以直接在字符串上工作。 +1 @ALollz 是的,实际上直到我偶然尝试它时我才知道。 Pandas 总是让我感到惊讶,而且并不总是以糟糕的方式。 :) 当我运行它时,我仍然得到相同的 1970 年结果,而不是你上面得到的结果。任何想法为什么? df2.index = pd.to_datetime(df2.index, unit='ms') 我的最终目标是解析这些日期并充当我的熊猫数据框的索引。那里有点麻烦。再次感谢大家。和@abarnert,你会发现那个字符串技巧! @user2179795 你能edit你的问题给我们一个完整的例子,有样本数据吗?此外,即使完全运行此答案中的代码,或者仅使用您的示例数据,您是否会得到 1970?如果是这样,您有哪些版本的 Python 和 Pandas(以及,当我们使用它时,dateutil)? @abarnert 等人。很想听听您对上述示例的看法!

以上是关于这是啥日期时间格式以及如何解析它?的主要内容,如果未能解决你的问题,请参考以下文章

这是啥日期时间格式?即:“1551927028”[重复]

PHP 中的 RFC1123 和 RFC2822 日期时间格式有啥区别?

如何在 Java 中解析自定义的多种日期格式

如何格式化通过 AJAX 从 ASPX JSON 解析的日期?

如何解析已使用不同语言环境格式化的日期

将字符串格式的日期时间插入我的数据库导致我出现此错误。有啥解决办法吗?