【问题标题】:How to read csv with timedeltas and NaN?如何使用 timedeltas 和 NaN 读取 csv?
【发布时间】:2018-05-28 18:54:40
【问题描述】:

我正在尝试读取如下所示的 csv 文件:

              col 1             col 2             col 3      ...     col N
0        0 days 00:00:16   0 days 00:00:07   0 days 00:01:02          NaN
.
.
.
15000    0 days 01:40:00         NaN               NaN       ...      NaN

我尝试过的:

df = pd.read_csv('file.csv', sep=',', index_col=0, dtype=object)
df = df.applymap(lambda x: pd.to_timedelta(x))

但由于我有很多列和行,所以速度有点慢。有没有更合适的方法来做到这一点?

【问题讨论】:

  • parse_dates 在 pandas.read_csv

标签: python pandas csv timedelta


【解决方案1】:

read_csv 中的parse_datesdtype 参数不支持timedelta 对象。这里有几个选择。

applypd.to_timedelta

df = df.apply(pd.to_timedelta, errors='coerce')

或者,

for c in df.columns:
    df[c] = pd.to_timedelta(df[c], errors='coerce')

pd.read_csvconverters= 参数

另一种选择是在加载时传递converters 参数:

f = {i : pd.to_timedelta for i in range(N)}  # you can access columns by index
df = pd.read_csv('file.csv', sep=',', index_col=0, converters=f)

【讨论】:

  • 第一个解决方案非常好。我也喜欢第二个,但我不知道 N 的值。
  • @JordiSalinasSanMartín 啊,你可以通过阅读第一行并计算逗号的数量来解决这个问题,或者类似的东西......但这比它的价值更麻烦,所以如果第一种方法有效,你有我的许可使用它!
猜你喜欢
  • 2015-03-18
  • 2014-05-04
  • 2011-03-27
  • 2021-01-02
  • 1970-01-01
  • 2022-11-01
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多