Pandas DateTimeIndex

时间:2014-06-30 07:17:38

标签: python datetime pandas

我需要为我的数据帧设置DateTimeIndex。问题是我的源文件。 Date标题是Date(dd-mm-yy),但实际日期数据的格式为dd:mm:yy(24:06:1970)等。我有很多源文件,所以手动更改标题会很繁琐不好的编程实践。如何从python中解决这个问题?

也许创建一个打开它的源文件的副本,搜索日期标题,更改它然后关闭它?我是python的新手,所以我不确定这是否是最好的做事方式,如果是,我该如何实现这些代码?

目前我有这个;

df = pd.read_csv('test.csv',
                    skiprows = 4,
                    parse_dates = {'stamp':[0,1]},
                    na_values = 'NaN',                    
                    index_col = 'stamp'
                 )

其中,第0列是相关日期列,第1列是时间列。 我没有收到任何错误消息只是错误的数据。

很抱歉,我应该添加一个有问题的csv文件片段。我现在已在下面提供;

some stuff I dont want 
some stuff I dont want 
some stuff I dont want 
some stuff I dont want 
Date(dd-mm-yy),Time(hh:mm:ss),Julian_Day
01:07:2013,05:40:41,182.236586,659,1638.400000
01:07:2013,05:44:03,182.238924,659,1638.400000
01:07:2013,05:47:48,182.241528,659,1638.400000
01:07:2013,05:52:21,182.244687,659,1638.400000

2 个答案:

答案 0 :(得分:2)

我认为主要问题是标题行Date(dd-mm-yy), Time(hh:mm:ss), Julian_Day仅显示指定某些列名称。 Pandas无法推断如何处理其他数据。

尝试跳过文件的列名称行并传递pandasnames并定义您自己的date_parser

def my_parser(date, time):
    import datetime
    DATE_FORMAT = '%d:%m:%Y'
    TIME_FORMAT = '%H:%M:%S'
    date = datetime.datetime.strptime(date, DATE_FORMAT)
    time_weird_date = datetime.datetime.strptime(time, TIME_FORMAT)
    return datetime.datetime.combine(date, time_weird_date.time())

import pandas as pd
from cStringIO import StringIO

data = """\
some stuff I dont want 
some stuff I dont want 
some stuff I dont want 
some stuff I dont want 
Date(dd-mm-yy),Time(hh:mm:ss),Julian_Day
01:07:2013,05:40:41,182.236586,659,1638.400000
01:07:2013,05:44:03,182.238924,659,1638.400000
01:07:2013,05:47:48,182.241528,659,1638.400000
01:07:2013,05:52:21,182.244687,659,1638.400000
"""  

pd.read_csv(StringIO(data), skiprows=5, index_col=0, 
            parse_dates={'datetime':['date', 'time']}, 
            names=['date','time', 'Julian_Day', 'col_2', 'col_3'],
            date_parser=my_parser)

这应该可以满足您的需求。

正如你所说的你是python的新手,我应该补充一下,来自cStringIO import StringIOdata = """...StringIO(data)的部分只是为了让我可以将数据直接包含在这个答案中一个可运行的形式。您只需在自己的代码中使用pd.read_csv(my_data_filename, ...

答案 1 :(得分:0)

你的日期真的很奇怪,你应该把它们全部修好。如果由于某种原因你真的不能在磁盘上修复它们,我猜你可以内联它:

import re
from StringIO import StringIO
s = open('test.csv').read()
def rep(m):
    return '%s-%s-%sT' % (m.group('YY'), m.group('mm'), m.group('dd'))
s = re.sub(r'^(?P<dd>\d\d):(?P<mm>\d\d):(?P<YY>\d{4}),', rep, s, flags=re.M)
df = pd.read_csv(StringIO(s), skiprows=5, index_col=0, 
                 names=['time', 'Julian_Day', 'col_2', 'col_3'])

这只是像01:07:2013,05:40:41这样的奇怪日期,并将它们格式化为2013-07-01T05:40:41的ISO样式。那么大熊猫可以正常对待它们。请记住,这些将是UTC。