DateTime Date Format

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
Aaron
Beiträge: 20
Registriert: Di Nov 07, 2023 9:11 am

DateTime Date Format

Beitrag von Aaron »

Ich habe in meiner Datenbank die Zeit in folgendem Format hinterlegt und es ist keine Änderung zulässig..

Code: Alles auswählen

%M%T%Y %H%M%S 01/07/2022 21:58:46.152
R möchte aber ein anderes Format sehen. Wie kann ich R dazu bringen das Datumsformat zu konvertieren bzw. zu verwenden?

Aus der Datenbank

Code: Alles auswählen

01/02/2022 22:03:13.151,0.83987,0.84129
01/02/2022 22:05:03.942,0.83959,0.84143
01/02/2022 22:05:09.121,0.83982,0.84124

Code: Alles auswählen

# Create a table
dbExecute(con, "CREATE TABLE test (DateTime DATE, Beta DECIMAL, Alpha DECIMAL);")

# Inserting the table
dbExecute(con, "INSERT INTO test VALUES ('DateTime', 'Beta', 'Alpha');")
LG,
Aaron
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: DateTime Date Format

Beitrag von bigben »

Hallo Aaron,
Aaron hat geschrieben: Mi Nov 08, 2023 2:58 pmIch habe in meiner Datenbank die Zeit in folgendem Format hinterlegt und es ist keine Änderung zulässig.
Sorry, wenn ich nörgelig klinge, aber ich bin wirklich unsicher, ob und wie ich das verstehen soll. Sind das in der Datenbank wirklich Zeitpunkte/Timestamps oder ist das ein String/Text? Weil die Zeitpunkte sind ja Zeitpunkte und haben nicht wirklich ein Format und wenn das Strings sind, dann sollte man sich ernsthaft Gedanken darüber machen, die in Timestamps umzuwandeln. Ja, ein Terabyte ist viel Holz, aber Du hast doch die Timestamps bestimmt, weil Du auch damit rechnen oder damit Filtern möchtest. Wer verbietet eine entsprechende Änderung, sodass sie unzulässig wird?

DuckDBs CSV Parsing kann durchaus verschiedene Formate für Timestamps lesen und importieren. Sieh Dir mal das DAuckDB "COPY" Kommando an und hier instbesondere den Parameter "timestampformat". https://duckdb.org/docs/sql/statements/copy
Wie kann ich R dazu bringen das Datumsformat zu konvertieren bzw. zu verwenden?
Ich wollte gerade reflexartig

Code: Alles auswählen

as.POSIXct("01/02/2022 22:03:13.151", format  ="%d/%m/%Y %H:%M:%OS")

schreiben, aber das berücksichtigt die NAchkommastellen bei den Sedkunden nicht. Habe auf die Schnelle keine Antwort.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: DateTime Date Format

Beitrag von Athomas »

Gute Reflexe - er zeigt sie nicht an, aber er hat sie:

Code: Alles auswählen

a <- as.POSIXct("01/02/2022 22:03:13.151", format  ="%d/%m/%Y %H:%M:%OS")
as.numeric(a)%%1
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: DateTime Date Format

Beitrag von bigben »

Danke, Athomas.

Der Sinn der Datenbank ist es ja, einfache Dinge auf Datenbankebene zu erledigen und darauf zu bauen, dass das DBMS möglichst effektiv ist. DuckDB kennt die Funktion strptime() um Strings in Timestamps umzuwandeln. Könnte man dann etwa so einsetzen:

Code: Alles auswählen

library("duckdb")
#> Warning: package 'duckdb' was built under R version 4.2.3
#> Loading required package: DBI
bsp <- read.csv(text = "timest, beta, alpha
01/02/2022 22:03:13.151,0.83987,0.84129
01/02/2022 22:05:03.942,0.83959,0.84143
01/02/2022 22:05:09.121,0.83982,0.84124")
head(bsp)
#>                    timest    beta   alpha
#> 1 01/02/2022 22:03:13.151 0.83987 0.84129
#> 2 01/02/2022 22:05:03.942 0.83959 0.84143
#> 3 01/02/2022 22:05:09.121 0.83982 0.84124


con <- dbConnect(duckdb(), dbdir = ":memory:") #Erzeuge Datenbank im RAM
dbWriteTable(con, "tabelle", bsp)              #Schreibe Dataframe in Datenbank

dbGetQuery(con, "SELECT * FROM tabelle WHERE alpha > 0.84125;")
#>                    timest    beta   alpha
#> 1 01/02/2022 22:03:13.151 0.83987 0.84129
#> 2 01/02/2022 22:05:03.942 0.83959 0.84143

dbGetQuery(con, "SELECT strptime(timest, '%d/%m/%Y %H:%M:%S.%g') FROM tabelle WHERE alpha > 0.84125;")
#>   strptime(timest, '%d/%m/%Y %H:%M:%S.%g')
#> 1                      2022-02-01 22:03:13
#> 2                      2022-02-01 22:05:03

dbDisconnect(con)

---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: DateTime Date Format

Beitrag von bigben »

Wenn Änderungen nicht unzulässig wären, könnte man im nächsten Schritt DuckDB bitten, die Zeitangaben automatisch in der ganzen Spalte durch ein TIMESTAMP Format zu ersetzen. Als SQL-Anfänger würde ich mir das etwa so vorstellen:

Code: Alles auswählen

library("duckdb")
bsp <- read.csv(text = "time, beta, alpha
01/02/2022 22:03:13.151,0.83987,0.84129
01/02/2022 22:05:03.942,0.83959,0.84143
01/02/2022 22:05:09.121,0.83982,0.84124")


con <- dbConnect(duckdb(), dbdir = ":memory:") #Erzeuge Datenbank im RAM
dbWriteTable(con, "tabelle", bsp)              #Schreibe Dataframe in Datenbank
dbGetQuery(con, "FROM tabelle;")               #Daten mit Zeitangaben als String
#>                      time    beta   alpha
#> 1 01/02/2022 22:03:13.151 0.83987 0.84129
#> 2 01/02/2022 22:05:03.942 0.83959 0.84143
#> 3 01/02/2022 22:05:09.121 0.83982 0.84124

dbExecute(con, "ALTER TABLE tabelle ALTER time SET DATA TYPE TIMESTAMP USING strptime(time, '%d/%m/%Y %H:%M:%S.%g');")
#> [1] 0

dbGetQuery(con, "FROM tabelle")                #Daten nach der Umwandung in TIMESTAMP
#>                  time    beta   alpha
#> 1 2022-02-01 22:03:13 0.83987 0.84129
#> 2 2022-02-01 22:05:03 0.83959 0.84143
#> 3 2022-02-01 22:05:09 0.83982 0.84124

dbDisconnect(con)
Dazu zwei Anmerkungen:
1. Nein, ich habe keine Ahnung wie lange das für 1 TB dauern würde.
2. Der aufmerksame Beobachter wird merken: In meinem Post eins weiter oben werden die Timestamps mit Sekundenbruchteilen angezeigt, hier jetzt auf einmal nicht mehr. Ob das wieder nur eine Frage der Ausgabe ist oder ob das tatsächlich ein Fehler ist, dem werde ich jetzt nicht weiter nachgehen. Da müsstest Du Dich jetzt ggf. selbst drum kümmern, Aaron.

Schönen Abend noch,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten