working with datetimeindex convert python pandas datetime

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:

github.com/wdm0006/dateinfer

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.