我的数据框需要一个 DateTimeIndex。问题是我的源文件。日期 header 是 Date(dd-mm-yy),但实际日期数据的格式为 dd:mm:yy (24:06:1970) 等。我有很多源文件,因此手动更改 header 会很乏味并且不是良好的编程实践。如何从 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
最佳答案
我认为主要问题是标题行 Date(dd-mm-yy), Time(hh:mm:ss), Julian_Day
似乎只指定了一些列名称。 Pandas
无法推断如何处理其他数据。
尝试跳过文件的列名称行并传递 pandas
列 names
的列表并定义您自己的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 StringIO
, data = """...
,和StringIO(data)
部分只是为了让我可以将数据以可运行的形式直接包含在这个答案中。您只需要pd.read_csv(my_data_filename, ...
在你自己的代码中
关于python - Pandas 日期时间索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24484774/