python - with - Conversión de fecha y hora-¿Cómo extraer el formato inferido?
pandas working with datetime (3)
La biblioteca DateInfer (PyDateInfer) permite inferir fechas basadas en la secuencia de fechas disponibles:
Uso de documentos:
>>> 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''
>>>
Descargo de responsabilidad: he utilizado y luego contribuido a esta biblioteca
Aquí hay una matriz de valores de fecha y hora:
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
es muy bueno para inferir formatos de fecha y hora.
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)
¿Cómo puedo averiguar de forma dinámica qué formato de fecha y hora pd.to_datetime
deduce? Algo como: %Y-%m-%dT...
(lo siento, mi fecha y hora foo es realmente mala ).
No creo que sea posible hacer esto con total generalidad en los pandas.
Como se mencionó en otros comentarios y respuestas, la función interna _guess_datetime_format
está cerca de ser lo que usted solicita, pero tiene criterios estrictos para lo que constituye un formato adivinable y por lo tanto solo funcionará para una clase restringida de cadenas de fecha y hora.
Estos criterios se establecen en la función _guess_datetime_format
en estas líneas y también puede ver algunos ejemplos de formatos buenos y malos en el script test_parsing .
Algunos de los puntos principales son:
- Año, mes y día deben estar presentes y ser identificables.
- el año debe tener cuatro dígitos
- se deben usar exactamente seis dígitos si se usan microsegundos
- no puedes especificar una zona horaria
Esto significa que no podrá adivinar el formato de las cadenas de fecha y hora en la pregunta a pesar de que tienen un formato ISO 8601 válido:
>>> 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
En este caso, bajar la zona horaria y rellenar los microsegundos a seis dígitos es suficiente para hacer que los pandas reconozcan el formato:
>>> 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''
Esto es probablemente tan bueno como se pone.
Si no se le pide a pd.to_datetime
que pd.to_datetime
el formato de la matriz, o se le da una cadena de formato para que pruebe, simplemente intentará analizar cada cadena por separado y esperará que tenga éxito. Fundamentalmente, no es necesario inferir un formato por adelantado para hacer esto.
Primero, pandas analiza la cadena asumiendo que es ( approximately ) un formato ISO 8601. Esto comienza en una llamada a _string_to_dts
y finalmente llega a la función parse_iso_8601_datetime
bajo nivel que realiza el trabajo duro.
Puede verificar si su cadena se puede analizar de esta manera utilizando la función _test_parse_iso8601
. Por ejemplo:
from pandas._libs.tslib import _test_parse_iso8601
def is_iso8601(string):
try:
_test_parse_iso8601(string)
return True
except ValueError:
return False
Las fechas en la matriz que das son reconocidas como este formato:
>>> is_iso8601(''2016-05-01T00:00:59.3+10:00'')
True
Pero esto no responde a lo que pregunta la pregunta y no veo ninguna forma realista de recuperar el formato exacto que reconoce la función parse_iso_8601_datetime
.
Si el análisis de la cadena como formato ISO 8601 falla, los pandas recurren al uso de la función parse()
de la biblioteca de datos de terceros (llamada por parse_datetime_string
). Esto permite un nivel fantástico de flexibilidad de análisis pero, una vez más, no conozco ninguna buena forma de extraer el formato de fecha y hora reconocido de esta función.
Si ambos de estos dos analizadores fallan, los pandas NaT
un error, ignoran la cadena o NaT
predeterminado de NaT
(dependiendo de lo que especifique el usuario). No se realiza ningún otro intento para analizar la cadena o adivinar el formato de la cadena.
Puede usar _guess_datetime_format
desde core.tools
para obtener el formato. es decir
from pandas.core.tools import datetimes as tools
tools._guess_datetime_format(pd.to_datetime(array).format()[0][:10])
Salida:
''%Y-%m-%d''
Para saber más sobre este método puedes ver here . Espero eso ayude.