Skip to content

CSV Datareader Plugin Timestamp Parsing Issue #1070

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
anirudlappathi opened this issue May 2, 2025 · 0 comments
Open

CSV Datareader Plugin Timestamp Parsing Issue #1070

anirudlappathi opened this issue May 2, 2025 · 0 comments

Comments

@anirudlappathi
Copy link

anirudlappathi commented May 2, 2025

Error reading file | Couldn't parse timestamp
Parsing format: [None]
Time at line 1 : [2025-04-17T17:00:08]

I found that I am getting this error on the auto timestamp parsing.

#include
#include
#include
#include
#include
#include

std::optional AutoParseTimestamp(const QString& str)
{
bool is_number = false;
QString str_trimmed = str.trimmed();
double val = 0.0;

// Support the case where the timestamp is in nanoseconds / microseconds
int64_t ts = str.toLong(&is_number);
const int64_t first_ts = 1400000000; // July 14, 2017
const int64_t last_ts = 2000000000; // May 18, 2033
if (is_number)
{
// check if it is an absolute time in nanoseconds.
// convert to seconds if it is
if (ts > first_ts * 1e9 && ts < last_ts * 1e9)
{
val = double(ts) * 1e-9;
}
else if (ts > first_ts * 1e6 && ts < last_ts * 1e6)
{
// check if it is an absolute time in microseconds.
// convert to seconds if it is
val = double(ts) * 1e-6;
}
else
{
val = double(ts);
}
}
else
{
// Try a double value (seconds)
val = str.toDouble(&is_number);
}

// handle numbers with comma instead of point as decimal separator
if (!is_number)
{
static QLocale locale_with_comma(QLocale::German);
val = locale_with_comma.toDouble(str, &is_number);
}
if (!is_number)
{
QDateTime ts = QDateTime::fromString(str, Qt::ISODateWithMs);
if (ts.isValid())
{
return double(ts.toMSecsSinceEpoch()) / 1000.0;
}
else
{
return std::nullopt;
}
}
return is_number ? std::optional(val) : std::nullopt;
};

int main(int argc, char *argv[])
{
QStringList testStrings = {
"2025-04-17T17:00:08"
};

std::cout << std::fixed << std::setprecision(9);

for (const QString& testStr : testStrings) {
    std::optional<double> result = AutoParseTimestamp(testStr);
    std::cout << "Input: [" << testStr.toStdString() << "] -> Parsed (seconds): ";
    if (result) {
        std::cout << *result << std::endl;
    } else {
        std::cout << "[Failed]" << std::endl;
    }
}

return 0;

}

I created this file to test the function that PlotJuggler uses itself and it works properly.

g++ tzparse.cpp -o timestamp_parser -lQt6Core -I/usr/include/x86_64-linux-gnu/qt6 -I/usr/include/x86_64-linux-gnu/qt6/QtCore -fPIC && ./timestamp_parser
Input: [2025-04-19T22:07:29.568] -> Parsed (seconds): 1745125649.568000078

Image

I have tried out various timestamp formats and using the parser aswell but the only thing that seems to worked for me to get the data with timestamp on the x axis is using an epoch rather than a timestamp

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant