我有一个DF,包含以下列:
datetime datetime64[ns]
objid int64
delay timedelta64[ns]
延迟输出的一个例子是:`
0 days 00:04:59
出于某种原因,当我将这个DF加载到dcc中时。存储会话变量,
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
?
使用to_json()
时,日期时间和延迟将更改为ms。使用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))
输出
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
您的"时间增量";以毫秒为单位,而不是以秒为单位,因此使用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)