【发布时间】:2014-07-19 11:24:47
【问题描述】:
我有 CSV 数据,其中以年作为列之一,而不是通常的月份和日期。我花了一个小时,这是我唯一能做的事情:将所有浮点列转换为整数,打印为字符串,然后使用自定义解析例程将字符串转换为日期时间:
from pylab import *
import pandas as pd
import datetime as dt
from StringIO import StringIO
csv = '''Latitude, Longitude, Hours, Minutes, Seconds, YearDay, Year, CruiseID
41.942880, -70.292217, 23, 54, 20, 253, 2011, 11015
41.942865, -70.292160, 23, 54, 22, 253, 2011, 11015
41.942847, -70.292105, 23, 54, 24, 253, 2011, 11015
41.942827, -70.292052, 23, 54, 26, 253, 2011, 11015
41.942803, -70.292002, 23, 54, 28, 253, 2011, 11015
'''
def parse(hr, mn, sec, yearday, yr):
date_string = '%4.4d %3.3d %2.2d %2.2d %2.2d' % (int(yr), int(yearday), int(hr), int(mn), int(sec))
return dt.datetime.strptime(date_string, "%Y %j %H %M %S")
df = pd.read_csv(StringIO(csv),skipinitialspace=True,
parse_dates={'datetime':['Hours','Minutes','Seconds','YearDay','Year']},
date_parser=parse, index_col='datetime',skipfooter=1)
这确实给出了正确的结果:
print df
Latitude Longitude CruiseID
datetime
2011-09-10 23:54:20 41.942880 -70.292217 11015
2011-09-10 23:54:22 41.942865 -70.292160 11015
2011-09-10 23:54:24 41.942847 -70.292105 11015
2011-09-10 23:54:26 41.942827 -70.292052 11015
2011-09-10 23:54:28 41.942803 -70.292002 11015
2011-09-11 00:08:48 41.933332 -70.281817 11015
但是读取这些数据的更简单、更好的方法是什么?
【问题讨论】:
-
这看起来是个好方法。
-
哇,好吧!我想我被转换为整数并写出字符串所困扰。我想我可以通过在
read_csv参数中分配 dtype 来解决整数转换问题,但这并不简单。 -
啊,是的,你不能做一个更直接的字符串替换......或者''.join((小时,年日,..))。您不必转换为 int 并返回!
-
安迪,你想在下面发布改进的解决方案,以便人们可以轻松找到它(这样我就可以奖励你积分)?
标签: python datetime csv pandas