这是一个日期时间值数组:
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 非常糟糕)。
答案 0 :(得分:29)
我不认为在熊猫中完全可以做到这一点。
正如其他评论和答案中所提到的,内部函数_guess_datetime_format
接近于您的要求,但它对可猜测格式的构成有严格的标准,因此它只适用于受限制的类日期时间字符串。
这些条件在these lines上的_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解析字符串,假设它是(approximately)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
调用)。这样可以提供出色的解析灵活性,但同样,我不知道从这个函数中提取已识别的日期时间格式的任何好方法。
如果这两个解析器的两个都失败了,pandas会引发错误,忽略字符串或默认为NaT
(取决于用户指定的内容)。不再进一步尝试解析字符串或猜测字符串的格式。
答案 1 :(得分:8)
DateInfer(PyDateInfer)库允许根据可用日期的顺序推断日期:
来自文档的用法:
>>> 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'
>>>
免责声明:我已经使用过,然后参与了这个库
答案 2 :(得分:5)
您可以使用_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'
要了解有关此方法的更多信息,请参阅here。希望能帮助到你。