从制表符分隔的文本文件中读取日期
Posted
技术标签:
【中文标题】从制表符分隔的文本文件中读取日期【英文标题】:Read date from tab delimited text file 【发布时间】:2018-05-24 14:15:03 【问题描述】:我最近才切换到 Python,所以这个问题可能有一个非常简单的解决方案,但我似乎找不到它。我有一个格式如下的文本文件:
08-05-90 0:00:00 1.78 7.1 10
08-05-90 3:00:00 2.01 7.4 11.1
08-05-90 6:00:00 1.74 7 10.5
08-05-90 9:00:00 1.97 7 11.1
08-05-90 12:00:00 1.78 6.3 11.1
....
我想要做的只是根据时间和日期绘制数据(例如第 3 列)。所以我将第三列提取为一个 Numpy 数组使用
data = np.loadtxt(fl_name,delimiter='\t',usecols=2)
我还想将日期和时间提取为一个数组,所以我尝试的是(希望以后可以以某种方式合并日期和时间):
date = np.genfromtxt(fl_name,delimiter='\t',usecols=0,converters=0: lambda x: datetime.strptime(x.decode('ascii'),"%d-%m-%y"))
time = np.genfromtxt(fl_name,delimiter='\t',usecols=1,converters=1: lambda x: datetime.strptime(x.decode('ascii'),"%H:%M:%S"))
这给了我
In [166]: date
Out[166]:
array([datetime.datetime(1990, 5, 8, 0, 0),
datetime.datetime(1990, 5, 8, 0, 0),
datetime.datetime(1990, 5, 8, 0, 0), ...,
datetime.datetime(1992, 4, 7, 0, 0),
datetime.datetime(1992, 4, 7, 0, 0),
datetime.datetime(1992, 4, 7, 0, 0)], dtype=object)
In [167]: time
Out[167]:
array([datetime.datetime(1900, 1, 1, 0, 0),
datetime.datetime(1900, 1, 1, 3, 0),
datetime.datetime(1900, 1, 1, 6, 0), ...,
datetime.datetime(1900, 1, 1, 0, 0),
datetime.datetime(1900, 1, 1, 3, 0),
datetime.datetime(1900, 1, 1, 6, 0)], dtype=object)
显然这不是我想要的,所以我的问题是 - 如何从我的文本文件中获取包含时间和日期的 datetime 数组,如下所示:
array([datetime.datetime(1990, 5, 8, 0, 0),
datetime.datetime(1990, 5, 8, 3, 0),
datetime.datetime(1990, 5, 8, 6, 0),
...
感谢您的意见!
【问题讨论】:
【参考方案1】:希望除了 numpy 之外,您还可以使用 pandas。如果是这样,组合列的日期时间很简单:
代码:
df['datetime'] = pd.to_datetime(df.date + ' ' + df.time)
测试代码:
import pandas as pd
data = StringIO('\n'.join([x.strip() for x in u"""
08-05-90 0:00:00 1.78 7.1 10
08-05-90 3:00:00 2.01 7.4 11.1
08-05-90 6:00:00 1.74 7 10.5
08-05-90 9:00:00 1.97 7 11.1
08-05-90 12:00:00 1.78 6.3 11.1
""".split('\n')[1:-1]]))
df = pd.read_fwf(data, names='date time x y z'.split())
df['datetime'] = pd.to_datetime(df.date + ' ' + df.time)
print(df)
print(df.dtypes)
结果:
date time x y z datetime
0 08-05-90 0:00:00 1.78 7.1 10.0 1990-08-05 00:00:00
1 08-05-90 3:00:00 2.01 7.4 11.1 1990-08-05 03:00:00
2 08-05-90 6:00:00 1.74 7.0 10.5 1990-08-05 06:00:00
3 08-05-90 9:00:00 1.97 7.0 11.1 1990-08-05 09:00:00
4 08-05-90 12:00:00 1.78 6.3 11.1 1990-08-05 12:00:00
date object
time object
x float64
y float64
z float64
datetime datetime64[ns]
【讨论】:
太棒了,这就是我想要的。只是一个补充——出于某种原因,在我的情况下,我不得不使用df = pd.read_csv(fname, names='date time x y z'.split())
我无法让read_fwf
正常工作(可能是因为我的文本文件的格式)。再次感谢!以上是关于从制表符分隔的文本文件中读取日期的主要内容,如果未能解决你的问题,请参考以下文章