Tengo un marco de datos de pandas que se importó desde una base de datos. Una columna es del tipo datetime64[ns]. Quiero copiar el marco de datos en una tabla de datos JMP, sin embargo, los datos de datatime se pierden (valores faltantes) cuando se utiliza el método de esta publicación: https://community.jmp.com/t5/JMPer-Cable/New-in-JMP-18-Python-jmp-DataTable-and-pandas-DataFrame/ba-p/744680
A continuación se muestra un ejemplo:
import jmp
import pandas as pd
from pandas.api.types import is_object_dtype, is_numeric_dtype, is_bool_dtype, is_string_dtype, is_datetime64_dtype
df = pd.DataFrame({'txt': ['A', 'B'],
'num': [ 123, 543 ],
'time': [pd.to_datetime('2024-11-24 12:34:56'), pd.to_datetime('2024-11-25 12:34:56')]})
# ------- WORKAROUNDS BELOW -------
# Creating two new columns to get the datetime column to JMP data table
# Convert datetime to epoch and add Num( 01Jan1970 ) to match JMP's method:
df['datetime_epoch'] = df['time'].astype('int64')//1e9 + 2082844800
# or... create new column with datetime as a string
df['time_str'] = df[ 'time' ].astype('str')
# -------
dt0 = jmp.DataTable( 'tb', df.shape[0] )
# get the column names from the data frame
names = list(df.columns)
for j in range( df.shape[1] ):
# check if the coulumn data type is string or numeric
if is_string_dtype(df[ names[j] ] ):
dt0.new_column(names[j], jmp.DataType.Character )
else:
dt0.new_column(names[j], jmp.DataType.Numeric )
# populate the JMP column with data
dt0[j] = list(df.iloc[:,j])Un par de soluciones alternativas son cambiar la fecha y hora a una cadena y luego usar Parse Date() en una nueva columna, o concertar la fecha y hora a un entero, agregar el desplazamiento necesario y luego reformatearlo en la tabla JMP.
// New column to parse the string format date
Data Table( "tb" ):Column 6 << Input Format( "d/m/y h:m:s", 0 ) <<
Format( "d/m/y h:m:s", 22, 0 ) << Set Formula( Parse Date( :time_str ) );
// Convert the epoch date format to human readable
Data Table( "tb" ):datetime_epoch << Input Format( "d/m/y h:m:s", 0 ) <<
Format( "d/m/y h:m:s", 22, 0 );
Ambos están bien, pero requieren algo de trabajo y dejan algunas columnas redundantes. ¿Existe una forma adecuada de hacerlo con JMP?
Estoy usando JMP 18.1.1.
Creo que ambos métodos están bien. JMP no reconoce la marca de tiempo, lo cual creo que notaste)

También puedes hacer una conversión directa (creo que esto podría usar un .csv temporal)
import jmp
import pandas as pd
from pandas.api.types import is_object_dtype, is_numeric_dtype, is_bool_dtype, is_string_dtype, is_datetime64_dtype
df = pd.DataFrame({'txt': ['A', 'B'],
'num': [ 123, 543 ],
'time': [pd.to_datetime('2024-11-24 12:34:56'), pd.to_datetime('2024-11-25 12:34:56')]})
jmp.run_jsl("""
dt = Python Get(df);
dt << new data view;
Python Send(dt);
"""
)
Gracias @jthi . El método Get() de Python parece guardar un archivo .csv temporal. Por ahora, utilizaré las soluciones alternativas, pero sería bueno tener una forma integrada más eficiente de copiar los marcos de datos de Pandas a las tablas de JMP.