我需要读取一个csv文件,其中一列以HH:MM:SS格式存储一天中的时间。我需要与这些时间进行比较,所以我的想法是使用datetime。日期信息不相关,也不存在于文件中。
如果我读取文件并解析日期:
import pandas as pd
dateparse = lambda x: pd.datetime.strptime(x, '%H:%M:%S')
my_data = pd.read_csv(file_name, parse_dates=['Time'], date_parser=dateparse)
print(my_data.loc[0]['Time'])
我得到1900-01-01 11:03:41。如何摆脱日期和年份?我不需要它,在我的输出文件中也不需要它 有没有办法将此列读取为datetime.time格式?
我也尝试过:
my_data = pd.read_csv(file_name, parse_dates=['Time'],
date_parser=lambda x: pd.to_datetime(x, format='%H:%M:%S'))
具有相同的结果。
答案 0 :(得分:1)
如果您只想将输出修改为csv,可以在date_format
中指定to_csv
:
In[130]:
df = pd.DataFrame({'date':[pd.datetime.strptime('11:03:41', '%H:%M:%S')]})
df.to_csv(date_format='%H:%M:%S')
Out[130]: ',date\n0,11:03:41\n'
我建议您将数据保留为datetime64
,因为它允许您对列执行矢量化算术,如果您存储为datetime.time
个对象,那么它会限制您可以执行的操作
您始终可以添加其他列作为datetime.time
或str
表示形式:
In[131]:
df['time'] = df['date'].dt.time
df['str_rep'] = df['date'].dt.strftime('%H:%M:%S')
df
Out[131]:
date time str_rep
0 1900-01-01 11:03:41 11:03:41 11:03:41
证明我的观点:
In[136]:
df = pd.DataFrame({'date':pd.to_datetime(['11:03:41', '15:23:33'], format='%H:%M:%S').time})
df
Out[136]:
date
0 11:03:41
1 15:23:33
现在如果我们执行算术:
df['date'].diff()
这将引发:
TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time'
如果我们将dtype
保持为datetime64
,我们仍然可以执行算术和比较,因为日期完全相同,无论如何取决于您正在做的事情:
In[138]:
df = pd.DataFrame({'date':pd.to_datetime(['11:03:41', '15:23:33'], format='%H:%M:%S')})
df
Out[138]:
date
0 1900-01-01 11:03:41
1 1900-01-01 15:23:33
In[139]:
df.diff()
Out[139]:
date
0 NaT
1 04:19:52
<强>更新强>
如果您真的想要datetime.time
,那么您可以修改lambda
:
dateparse = lambda x: pd.datetime.strptime(x, '%H:%M:%S').time()
my_data = pd.read_csv(file_name, parse_dates=['Time'], date_parser=dateparse)
或者这也可以:
my_data = pd.read_csv(file_name, parse_dates=['Time'],
date_parser=lambda x: pd.to_datetime(x, format='%H:%M:%S').time())
比较和一些算术运算可行,但它不如原始datetime64
dtype灵活。