pd.read_csv(parse_dates... [date_formatter=])返回dtype为'object'而非'datetime64
我的输入CSV文件里有两个时间日期列,分别是'开始时间'和'结束时间',它们的格式是时间戳。
我可以正确解析这些时间戳,但我就是无法把结果列变成datetime64格式!
无论我是否使用自定义的日期格式化函数mdb_to_datetime()
,或者把它注释掉,结果列始终是'np.object',这其实是'np.string'的一个包装。(这在后面进行日期计算时会出问题。)
我尝试在读取CSV后,对结果的对象(字符串)列使用cal['开始时间'].astype(np.datetime64)
,但也失败了。
from datetime import datetime
def mdb_to_datetime(ts):
"""Convert Access MDB to datetime"""
return datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M')
cal = pd.read_csv('my.csv', header=0,
usecols = ['Start Time','End Time','Summary'],
parse_dates = ['Start Time','End Time'] )
#, date_parser = mdb_to_datetime )
# my.csv looks like (uninteresting columns removed):
Start Time,End Time,Summary
"1209396600","1209429000","some event"
"1226163600","1226206800","another event"
补充说明:
1) 多亏了@merlin2011,现在这似乎能满足我的需求,但有没有人能把这行代码简化一下?
def mdb_to_datetime(ts):
return np.datetime64(datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M'))
2) 有没有其他人觉得文档有问题,因为里面没有提到自定义日期格式化函数应该返回np.datetime64
?
1 个回答
1
来回答你的问题:
2) 自定义的日期格式化器不一定要返回 np.datetime64
,只要返回类似日期时间的格式就可以了(文档上说的是:“把字符串转换成日期时间实例”)。所以 datetime.datetime
是可以的,不需要把它转换成字符串。
1) 这也回答了第一个问题,你可以通过省略 strftime
来简化:
def mdb_to_datetime(ts):
return datetime.fromtimestamp(float(ts))
你还可以使用 pandas 的 to_datetime
函数: pd.to_datetime(ts, unit='s')