【问题标题】: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), 
       ...

感谢您的意见!

【问题讨论】:

    标签: python arrays numpy datetime


    【解决方案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 正常工作(可能是因为我的文本文件的格式)。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2019-12-07
    • 2012-12-01
    • 1970-01-01
    • 2020-02-01
    相关资源
    最近更新 更多