Глядя, чтобы преобразовать секунды с эпохи в читаемое время даты (работает на ма c, а не на P C) - PullRequest
0 голосов
/ 16 марта 2020

У меня есть программа, которая создает следующий фрейм данных:

         datetime     open    high     low   close  volume
7995  1584143700000  267.690  267.69  267.53  267.60    5016
7996  1584143760000  267.600  267.62  267.36  267.53    9183
7997  1584143820000  267.530  267.53  267.40  267.44    8567
7998  1584143880000  267.485  267.70  267.42  267.46   28488
7999  1584143940000  267.450  267.50  267.11  267.45   13395

На моем Ma c я использую следующий оператор:

df['datetime'] = pd.to_datetime(df['datetime'].astype(int), unit='ms')

для преобразования столбца datetime в UT C, который работает отлично и возвращает:

                datetime     open    high     low   close  volume
7995 2020-03-13 23:55:00  267.690  267.69  267.53  267.60    5016
7996 2020-03-13 23:56:00  267.600  267.62  267.36  267.53    9183
7997 2020-03-13 23:57:00  267.530  267.53  267.40  267.44    8567
7998 2020-03-13 23:58:00  267.485  267.70  267.42  267.46   28488
7999 2020-03-13 23:59:00  267.450  267.50  267.11  267.45   13395

Когда я запускаю программу на P C - она ​​возвращает значения в 1960-х (до времени эпохи), поэтому мне интересно, что изменится или строка, мне нужно иметь правильный вывод.

Строка 7999 возвращает на P C:

         datetime     open    high     low   close  volume
7999  1969-12-23  267.450  267.50  267.11  267.45   13395

Почему и что отвечает за разницу между системами и как я могу исправить для windows?

1 Ответ

1 голос
/ 16 марта 2020

Я только что попытался запустить следующие 2 строки на P C, он работает просто отлично, получая 2020-03-13 23:59:00 результат. TBH, я незнаком с pandas фреймами данных, но мое лучшее предположение будет изменено astype(int) на astype(int64) или что-то подобное, подозревая, что int может быть 32-битным.

Обратите внимание, это не безосновательное предположение. 1584143940000 равно 0x170D65639A0, обрезано до 32 бит, оно 0xD65639A0, приведено к 32-битному знаку и его -698992224, pd.to_datetime(-698992224, unit='ms') дает вам 1969-12-23, которое вы получите.

import pandas as pd
print(pd.to_datetime(1584143940000, unit='ms'))

Редактировать: подозрение подтверждается запуском следующего:

import pandas as pd, numpy

df = pd.DataFrame([1584143940000], columns=['x'])

print(pd.to_datetime(df.x[0], unit='ms'))
print(pd.to_datetime(df.x[0].astype(int), unit='ms'))
print(pd.to_datetime(df.x[0].astype(numpy.int64), unit='ms'))

и получением этого вывода:

2020-03-13 23:59:00
1969-12-23 21:50:07.776000
2020-03-13 23:59:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...