当我导出到 csv 时松散的 timedelta 格式 - 有解决方案吗?

loose timedelta format when I export to csv - is there a solution?

我有一个 Pandas 带有日期时间对象(包括 timedelta)的数据框。当我创建 DF 时,一切都很好,但是当我将它导出到 csv 然后再次导入时,日期时间对象是字符串。

我试过使用

pd.read_csv('xyz.csv',parse_dates=True)

导入时以及

df.to_csv('xyz.csv',date_format='%Y-%m-%d %H:%M:%S')

导出时。但是没用。

上下文: 我创建了一个生成数据的程序,将它放在一个 pandas DF 中,这些 DF 必须存储到下次打开该程序。

所以我的问题是:是否有可能用 CSV.format 做到这一点?一般来说,导出 pandas DF 以尽可能多地保留其属性的最佳格式是什么? 谢谢!

编辑:

数据样本: 这是 DF 中的一行(索引是日期时间对象)。列是 'Tasks'(字符串格式)和 'Duration'(timedelta 对象)。

2017-04-18 08:11:39|PyMC3_Book|0 天 00:24:49.919194

我想你可以使用 to_pickle and then read_pickle - docs:

df.to_pickle('xyz.pkl')

df = pd.read_pickle('xyz.pkl')

但如果需要timedelta:

import pandas as pd
import numpy as np
from pandas.compat import StringIO

temp=u"""Tasks|Duration
2017-04-18 08:11:39|PyMC3_Book|0 days 00:24:49.919194"""
#after testing replace 'StringIO(temp)' to 'filename.csv'
df = pd.read_csv(StringIO(temp), sep="|", index_col=None, parse_dates=False)

print (df)
                          Tasks                Duration
2017-04-18 08:11:39  PyMC3_Book  0 days 00:24:49.919194

df.to_csv('xyz.csv')

df = pd.read_csv('xyz.csv', index_col=0, parse_dates=True)
df['Duration'] = pd.to_timedelta(df['Duration'])
print (df)
                          Tasks        Duration
2017-04-18 08:11:39  PyMC3_Book 00:24:49.919194

print (df.dtypes)
Tasks                object
Duration    timedelta64[ns]
dtype: object

print (df.index)

DatetimeIndex(['2017-04-18 08:11:39'], dtype='datetime64[ns]', freq=None)

这不是 read_csvs parse_dates 参数的工作方式

From the Docs:

  • parse_dates : 布尔值或整数列表或名称列表或列表列表或字典,默认为 False
    • 布尔值。如果为真 -> 尝试解析索引。
    • 整数或名称列表。例如If [1, 2, 3] -> 尝试将第 1、2、3 列分别解析为单独的日期列。
    • 列表列表。例如如果 [[1, 3]] -> 组合第 1 列和第 3 列并解析为 单个日期列。
    • 字典,例如{‘foo’ : [1, 3]} -> 将第 1、3 列解析为日期并调用结果‘foo’
  • 注意:存在 iso8601 格式日期的快速路径。

所以它告诉我们 parse_dates=True 只尝试解析索引。否则,您需要传递一个列位置列表,指示需要解析为日期的列。


您可能希望使用 converters 字典来显式处理这些列
考虑以下 df

df = pd.DataFrame(dict(
        A=pd.to_datetime(['2017-01-01']),
        B=pd.to_timedelta([37], unit='s')
    ))

写入文件

df.to_csv('test.csv', index=None)

定义converters字典

converters = dict(A=pd.to_datetime, B=pd.to_timedelta)
# in your case
# converters = dict(Duration=pd.to_timedelta)

读取 csv

df = pd.read_csv('test.csv', converters=converters)

df

           A        B
0 2017-01-01 00:00:37

df.dtypes

A     datetime64[ns]
B    timedelta64[ns]
dtype: object