Pandas日期时间索引

1 投票
2 回答
782 浏览
提问于 2025-04-18 11:33

我需要为我的数据框(dataframe)创建一个日期时间索引(DateTimeIndex)。问题在于我的源文件。日期的标题是“日期(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

你的日期格式真奇怪,最好把它们都修正一下。如果你真的因为某些原因不能直接在文件上修复,那你可以在代码里处理一下:

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 这样的奇怪日期格式转换成 ISO 风格的格式,比如 2013-07-01T05:40:41。这样一来,pandas 就可以正常处理这些日期了。记住,这些日期会是以 UTC 时间显示的。

2

我觉得主要的问题是,文件的头部那一行 Date(dd-mm-yy), Time(hh:mm:ss), Julian_Day 只列出了一些列的名字。Pandas 不知道该怎么处理其他的数据。

你可以试着跳过文件的列名那一行,然后给 pandas 传一个列名的列表,并自己定义一个 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,我还想补充一下,from cStringIO import StringIOdata = """...StringIO(data) 这些部分只是为了让我能直接在这个回答中包含数据,并且可以运行。你只需要在自己的代码中用 pd.read_csv(my_data_filename, ... 就可以了。

撰写回答