我需要读取一个 csv 文件,其中一列以 HH:MM:SS 格式存储一天中的时间。我需要与这些时间进行比较,所以我的想法是使用日期时间。日期信息不相关也不存在于文件中。
如果我读取文件并像这样解析日期:
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'))
结果相同。
最佳答案
如果您只想将输出修改为 csv,您可以在 to_csv
中指定 date_format
:
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())
比较和一些算术运算可以工作,但它不如 native datetime64
数据类型灵活。
关于python - Pandas - 使用 read_csv 读取时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50703425/