Pandas - Как преобразовать float64 в timedelta и настроить вывод? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть DF со следующими столбцами:

datetime     datetime64[ns]
objid                 int64
delay        timedelta64[ns]

Пример вывода для задержки:

0 days 00:04:59

По какой-то причине, когда я загружаю этот DF в d cc. Сохранить переменную сеанса,

data = df.to_json()
return data

и прочитать ее в другом обратном вызове,

df = pd.read_json(data)

он возвращает следующие типы:

datetime    datetime64[ns]
objid                int64
delay               float64

теперь тот же пример, что и выше, вывод задержки:

299000.0

Я не уверен, почему он возвращает float64 вместо timedelta64 (может быть, из-за некоторых NaN?).

Итак, я Я делаю:

df['delay'] = pd.to_timedelta(df['delay'], unit='s')

, а результат:

P3DT11H3M20S

насколько я понимаю, он отличается от исходного результата даже в формате iso.

Что я делаю не так? Как мне преобразовать float64 в timedelta64 [s] и настроить вывод на %d %H:%M:%S?

Ответы [ 2 ]

1 голос
/ 05 августа 2020

datetime и delay заменяются на ms при использовании to_json(). Преобразуйте его обратно, используя astype()

import json
d = list(pd.date_range(dt.datetime(2020,7,1), dt.datetime(2020,7,2), freq="15min"))
df = pd.DataFrame({"datetime":d, "objid":[random.randint(0,100) for x in d], "delay":d - np.roll(d, 1)})

print(df.dtypes)
df2 = pd.DataFrame(json.loads(df.to_json()))
print(df2.dtypes)
df2 = df2.astype({"datetime":"datetime64[ms]","delay":"timedelta64[ms]"})
print(df2.dtypes)
print(df2[:10].to_string(index=False))

output

datetime     datetime64[ns]
objid                 int64
delay       timedelta64[ns]
dtype: object
datetime    int64
objid       int64
delay       int64
dtype: object
datetime     datetime64[ns]
objid                 int64
delay       timedelta64[ns]
dtype: object
           datetime  objid             delay
2020-07-01 00:00:00     59 -1 days +00:00:00
2020-07-01 00:15:00     14   0 days 00:15:00
2020-07-01 00:30:00     42   0 days 00:15:00
2020-07-01 00:45:00     29   0 days 00:15:00
2020-07-01 01:00:00     85   0 days 00:15:00
2020-07-01 01:15:00     37   0 days 00:15:00
2020-07-01 01:30:00     59   0 days 00:15:00
2020-07-01 01:45:00     61   0 days 00:15:00
2020-07-01 02:00:00     63   0 days 00:15:00
2020-07-01 02:15:00     14   0 days 00:15:00
0 голосов
/ 05 августа 2020

ваша "timedelta" находится в мс, а не с, поэтому используйте unit="ms"

, вы можете получить желаемый формат следующим образом:

timedeltas = pandas.to_timedelta([299000,301000],unit="ms")
print(timedeltas)
print(timedeltas.map(str)) # maybe close enough?
fmt = "{days} {hours:02d}:{minutes:02d}:{seconds:02d}"
exact = timedeltas.map(lambda timedelta:fmt.format(**timedelta.components.__dict__))
print(exact)
...