当我导出到 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_csv
s parse_dates
参数的工作方式
- 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
我有一个 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_csv
s parse_dates
参数的工作方式
- 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