J'ai un dataframe pandas qui a été importé depuis une base de données. Une colonne est de type datetime64[ns]. Je souhaite copier le dataframe dans une table de données JMP, mais les données datatime sont perdues (valeurs manquantes) lorsque j'utilise la méthode décrite dans cet article : https://community.jmp.com/t5/JMPer-Cable/New-in-JMP-18-Python-jmp-DataTable-and-pandas-DataFrame/ba-p/744680
Voici un exemple ci-dessous :
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])Plusieurs solutions de contournement consistent soit à modifier la date et l'heure en une chaîne, puis à utiliser Parse Date() dans une nouvelle colonne, soit à convertir la date et l'heure en un entier, à ajouter le décalage nécessaire, puis à la reformater dans la table 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 );
Les deux sont corrects, mais nécessitent un peu de travail et laissent des colonnes redondantes. Existe-t-il une méthode JMP appropriée pour procéder ?
J'utilise JMP 18.1.1.
Je pense que ces deux méthodes sont correctes. JMP ne reconnaît pas l'horodatage, ce que vous avez remarqué, je pense)

Vous pouvez également effectuer une conversion directe (je pense que cela pourrait utiliser un fichier .csv temporaire)
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);
"""
)
Merci @jthi . La méthode Python Get() semble enregistrer un fichier .csv temporaire. J'utiliserai les solutions de contournement pour l'instant, mais il serait bien d'avoir un moyen intégré plus efficace de copier les dataframes pandas dans les tables JMP.