熊猫 - 使用read_csv读取时间

时间:2018-06-05 15:10:31

标签: python pandas csv datetime

我需要读取一个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'))

具有相同的结果。

1 个答案:

答案 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.timestr表示形式:

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灵活。