日期时间转换 - 如何提取推断的格式?

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

这是一个日期时间值数组:

array = np.array(['2016-05-01T00:00:59.3+10:00', '2016-05-01T00:02:59.4+10:00',
                  '2016-05-01T00:03:59.4+10:00', '2016-05-01T00:13:00.1+10:00',
                  '2016-05-01T00:22:00.5+10:00', '2016-05-01T00:31:01.1+10:00'],
        dtype=object)

pd.to_datetime
非常擅长推断日期时间格式。

array = pd.to_datetime(array)

print(array)
DatetimeIndex(['2016-04-30 14:00:59.300000', '2016-04-30 14:02:59.400000',
               '2016-04-30 14:03:59.400000', '2016-04-30 14:13:00.100000',
               '2016-04-30 14:22:00.500000', '2016-04-30 14:31:01.100000'],
              dtype='datetime64[ns]', freq=None)

如何动态找出推断出的日期时间格式

pd.to_datetime
?类似于:
%Y-%m-%dT...
(抱歉,我的日期时间 foo 真的很糟糕)。

python pandas datetime datetime-format
3个回答
35
投票

我认为在 pandas 中不可能完全做到这一点。

正如其他评论和答案中提到的,内部函数

_guess_datetime_format
接近您所要求的,但它对构成可猜测格式的内容有严格的标准,因此它仅适用于有限类别的日期时间字符串.

这些标准在

这些行
_guess_datetime_format函数中列出,您还可以在test_parsing脚本中看到一些好格式和坏格式的示例。

一些要点是:

  • 年、月、日必须均存在且可识别
  • 年份必须有四位数字
  • 如果使用微秒,则必须使用六位数字
  • 您无法指定时区

这意味着它无法猜测问题中日期时间字符串的格式,尽管它们是有效的 ISO 8601 格式:

>>> from pandas.core.tools.datetimes import _guess_datetime_format_for_array
>>> array = np.array(['2016-05-01T00:00:59.3+10:00'])
>>> _guess_datetime_format_for_array(array)
# returns None

在这种情况下,删除时区并将微秒填充到六位数字足以使 pandas 识别格式:

>>> array = np.array(['2016-05-01T00:00:59.300000']) # six digits, no tz
>>> _guess_datetime_format_for_array(array)
'%Y-%m-%dT%H:%M:%S.%f'

这可能已经是最好的了。

如果不要求

pd.to_datetime
推断数组的格式,或者给出要尝试的格式字符串,它只会尝试单独解析每个字符串并希望成功。至关重要的是,它不需要提前推断格式来执行此操作。

首先,pandas 解析字符串,假设它是(大约)ISO 8601 格式。这从调用

_string_to_dts
开始,最终到达执行艰苦工作的低级
parse_iso_8601_datetime
函数。

您可以使用

_test_parse_iso8601
函数检查您的字符串是否能够以这种方式解析。例如:

from pandas._libs.tslib import _test_parse_iso8601

def is_iso8601(string):
    try:
        _test_parse_iso8601(string)
        return True
    except ValueError:
        return False

您给出的数组中的日期被识别为以下格式:

>>> is_iso8601('2016-05-01T00:00:59.3+10:00')
True

但这并不能满足问题的要求,而且我没有看到任何现实的方法来恢复

parse_iso_8601_datetime
函数识别的确切格式。

如果将字符串解析为 ISO 8601 格式失败,pandas 会回退到使用第三方 dateutil 库中的

parse()
函数(由
parse_datetime_string
调用)。这提供了极高的解析灵活性,但同样,我不知道有什么好方法可以从此函数中提取可识别的日期时间格式。

如果这两个解析器的both失败,pandas要么引发错误,忽略字符串,要么默认为

NaT
(取决于用户指定的内容)。不再尝试解析字符串或猜测字符串的格式。


12
投票

DateInfer (PyDateInfer) 库允许根据可用日期的顺序推断日期:

github.com/wdm0006/dateinfer

文档中的用法:

>>> import dateinfer
>>> dateinfer.infer(['Mon Jan 13 09:52:52 MST 2014', 'Tue Jan 21 15:30:00 EST 2014'])
'%a %b %d %H:%M:%S %Z %Y'
>>>

免责声明:我使用过这个库,然后为这个库做出了贡献


6
投票

您可以使用

_guess_datetime_format
中的
core.tools
来获取格式。即

from pandas.core.tools import datetimes as tools
tools._guess_datetime_format(pd.to_datetime(array).format()[0][:10])

输出:

'%Y-%m-%d'

要了解有关此方法的更多信息,您可以查看此处。希望能帮助到你。

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