使用yearday列将CSV数据读入Pandas作为datetime

时间:2014-05-29 20:11:55

标签: python datetime csv pandas

我已经将星期日的CSV数据作为其中一列,而不是通常的月份和日期。我在这上花了一个小时,这是我唯一可以工作的东西:将所有浮点列转换为整数,打印为字符串,然后使用自定义解析例程将字符串转换为datetime:

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

但是阅读这些数据的更简单,更好的方法是什么?

3 个答案:

答案 0 :(得分:2)

你可以把解析函数编写得更清晰,没有int转换:

def parse(hr, mn, sec, yearday, yr):
          date_string = ' '.join([yr, yearday, hr, mn, sec])
          return dt.datetime.strptime(date_string, "%Y %j %H %M %S")

除此之外,IMO你的解决方案看起来不错(我认为你需要在这里编写自己的解析器)。

答案 1 :(得分:1)

直接使用datetime()

示例(未经测试):

def parse(hr, mn, sec, yearday, yr):
   date1 = dt.datetime(year=int(yr), month=1, day=1, hour=int(hr), minute=int(mn), second=int(sec))
   return date1 + dt.timedelta(days=yearday-1)

答案 2 :(得分:1)

使用strptime '%j'格式:

>>> import datetime as dt
>>> dt.strptime('253 2011', '%j %Y')
>>> dt.datetime.strptime('253 2011', '%j %Y')
datetime.datetime(2011, 9, 10, 0, 0)

您也可以直接在strptime中使用逗号格式:

>>> dt.datetime.strptime('23, 54, 20, 253, 2011', '%H, %M, %S, %j, %Y')
datetime.datetime(2011, 9, 10, 23, 54, 20)

请注意,数字需要填零。 (即01而非1