【问题标题】:Pandas - How to convert from float64 to timedelta and customize the output?Pandas - 如何从 float64 转换为 timedelta 并自定义输出?
【发布时间】:2020-08-05 03:19:18
【问题描述】:

我有一个包含以下列的 DF:

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

延迟输出的一个例子是:`

0 days 00:04:59

由于某种原因,当我将此 DF 加载到 dcc.Store 会话变量中时,

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

【问题讨论】:

  • unit="ms" ...我认为可行
  • 好的!是的,它解决了部分问题。现在我通过 isoformat 接收到正确的值:P0DT0H4M59S。如何将输出格式化为 %d %H:%M:%S?谢谢!

标签: python pandas plotly-dash


【解决方案1】:

当使用to_json() 时,datetimedelay 被更改为 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

【讨论】:

  • 谢谢。它似乎有效,但由于我有一些带有 NaN 的行,我收到以下错误:ValueError:无法将非有限值(NA 或 inf)转换为整数。有什么建议只在填充的行上工作吗?
  • @iops 最简单的方法是df2["delay"] = df2["delay"].fillna(0)astype() 之前。清楚地选择对您有意义的默认值。我用df.loc[5,"datetime"] = np.nan df.loc[7,"delay"] = np.nan 模拟了这个
  • 我刚刚用 0 填充了 NaN,它正在工作!谢谢!!!
【解决方案2】:

你的“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)

【讨论】:

    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 2020-09-05
    相关资源
    最近更新 更多