Pandas日期时间索引
我需要为我的数据框(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 个回答
你的日期格式真奇怪,最好把它们都修正一下。如果你真的因为某些原因不能直接在文件上修复,那你可以在代码里处理一下:
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 时间显示的。
我觉得主要的问题是,文件的头部那一行 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 StringIO
、data = """...
和 StringIO(data)
这些部分只是为了让我能直接在这个回答中包含数据,并且可以运行。你只需要在自己的代码中用 pd.read_csv(my_data_filename, ...
就可以了。