Ich habe einen Pandas-Datenrahmen, der aus einer Datenbank importiert wurde. Eine Spalte ist vom Typ datetime64[ns]. Ich möchte den Datenrahmen in eine JMP-Datentabelle kopieren, allerdings gehen die Datenzeitdaten verloren (fehlende Werte), wenn ich die Methode in diesem Beitrag verwende: https://community.jmp.com/t5/JMPer-Cable/New-in-JMP-18-Python-jmp-DataTable-and-pandas-DataFrame/ba-p/744680
Nachfolgend sehen Sie ein Beispiel:
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])Einige Problemumgehungen bestehen darin, entweder das Datum und die Uhrzeit in eine Zeichenfolge zu ändern und dann „Parse Date()“ in einer neuen Spalte zu verwenden oder das Datum und die Uhrzeit in eine Ganzzahl umzuwandeln, den erforderlichen Offset hinzuzufügen und es dann in der JMP-Tabelle neu zu formatieren.
// 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 );
Beides ist in Ordnung, erfordert aber etwas Arbeit und hinterlässt einige redundante Spalten. Gibt es eine richtige JMP-Methode, um dies zu tun?
Ich verwende JMP 18.1.1.
Ich denke, beide Methoden sind in Ordnung. JMP erkennt den Zeitstempel nicht, was Ihnen, glaube ich, aufgefallen ist)

Sie können auch eine direkte Konvertierung durchführen (ich glaube, dabei wird möglicherweise eine temporäre CSV-Datei verwendet).
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);
"""
)
Danke, @jthi . Die Python Get()-Methode scheint eine temporäre CSV-Datei zu speichern. Ich werde vorerst die Workarounds verwenden, aber es wäre schön, eine effizientere integrierte Möglichkeit zum Kopieren von Pandas-Datenrahmen in JMP-Tabellen zu haben.