从空格分隔的 .dat 文件中获取日期时间 - python/pandas [重复]

Posted

技术标签:

【中文标题】从空格分隔的 .dat 文件中获取日期时间 - python/pandas [重复]【英文标题】:Getting datetime from space seperated .dat file - python/pandas [duplicate] 【发布时间】:2018-07-18 06:56:49 【问题描述】:

我正在尝试使用 pandas 导入一个以空格分隔的 .dat 文件并删除值以创建日期。数据长这样(三行数据取自整个数据集供参考):

2.0140000e+003  1.0000000e+000  1.0000000e+000  0.0000000e+000  0.0000000e+000 0.0000000e+000  2.7454583e+000  1.8333542e+002 -3.3580352e+001
2.0140000e+003  1.0000000e+000  2.0000000e+000  0.0000000e+000  0.0000000e+000  0.0000000e+000 -6.1330625e+000  2.5187292e+002 -1.3752231e+001
2.0140000e+003  1.0000000e+000  3.0000000e+000  0.0000000e+000  0.0000000e+000  0.0000000e+000 -3.0905729e+001  2.1295208e+002 -2.4507273e+001

前六个数字组成日期(年、月、日、时、分、秒)。

我可以使用以下方式导入数据:

df = pd.read_csv('daily.dat', sep='\s+', header=None)

它被很好地分开了。

但是,我想将该行的前六个条目剥离为一个日期。例如,从第一行开始,前六个数字(或导入到df 后的前六列)应该是:

2014-01-01 00:00:00

帮助?

【问题讨论】:

您可能正在寻找to_datetime()的解决方案 【参考方案1】:

演示:

当您读取没有列名(标题)的 CSV/dat 文件时,您将获得一个带有数字列名的 DF,如下所示:

In [139]: df
Out[139]:
        0    1    2    3    4    5          6          7          8
0  2014.0  1.0  1.0  0.0  0.0  0.0   2.745458  183.33542 -33.580352
1  2014.0  1.0  2.0  0.0  0.0  0.0  -6.133063  251.87292 -13.752231
2  2014.0  1.0  3.0  0.0  0.0  0.0 -30.905729  212.95208 -24.507273

列:

In [140]: df.columns
Out[140]: Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8], dtype='int64')

pd.to_datetime 可以从多列组合日期时间:

从 DataFrame 的多列中组装日期时间。按键 可以是常见的缩写,如[‘year’, ‘month’, ‘day’, ‘minute’, ‘second’, ‘ms’, ‘us’, ‘ns’]) 或相同的复数形式

In [141]: cols = ['year','month','day','hour','minute','second']

In [142]: df['date'] = pd.to_datetime(df.iloc[:, :6].rename(columns=lambda c: cols[c]))

删除前 6 列:

In [143]: df = df.iloc[:, 6:]

In [144]: df
Out[144]:
           6          7          8       date
0   2.745458  183.33542 -33.580352 2014-01-01
1  -6.133063  251.87292 -13.752231 2014-01-02
2 -30.905729  212.95208 -24.507273 2014-01-03

或者 (thanks @Idlehands for the idea) 我们可以这样删除它:

df = df.drop(columns=df.columns[:6])

【讨论】:

很好的答案。我手动转换了datetime,但这要好得多。一条评论是最后一滴可能对某些人来说有点难以阅读,我会使用df.drop(columns=list(range(6)), inplace=True),它更冗长。 @Idlehands,感谢您的评论 - 我已将其添加到答案中! 行得通!但是..你能解释为什么你设置'cols'吗?这些键是内置在 to_datetime 中的吗?为什么我不能直接将要转换为 datetime 的列发送到 to_datetime ?谢谢! @spencerchad,它已经在答案中了 - Pandas pd.to_datetime() 期望特定的列名 - The keys can be common abbreviations like [‘year’, ‘month’, ‘day’, ‘minute’, ‘second’, ‘ms’, ‘us’, ‘ns’]) or plurals of the same @spencerchad,很可能你有一个旧版 Pandas - 我已经在 Pandas 0.22.0 下测试过【参考方案2】:

你可以试试这个:

import pandas as pd
from datetime import datetime

df = pd.read_csv('daily.dat', sep='\s+', header=None)

def to_datetime(year,month,day,hour,minute,second):
    return datetime(int(year),int(month),int(day),int(hour),int(minute),int(second))

df['datetime'] = df.apply(lambda x: to_datetime(x[0], x[1], x[2], x[3], x[4], x[5]), axis=1).apply(str)

df.drop(list(range(6)),1,inplace=True)

print(df)

# output:
#           6          7          8             datetime
#0   2.745458  183.33542 -33.580352  2014-01-01 00:00:00
#1  -6.133063  251.87292 -13.752231  2014-01-02 00:00:00
#2 -30.905729  212.95208 -24.507273  2014-01-03 00:00:00

【讨论】:

以上是关于从空格分隔的 .dat 文件中获取日期时间 - python/pandas [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从仅使用空格作为分隔符的文件中获取要写入的二维数组

使用文件中的数据绘制日期和时间(x 轴)与值(y 轴)

使用文件中的数据绘制日期和时间(x 轴)与值(y 轴)

如何从 Laravel 集合中获取最小日期

从 .txt 中提取以空格分隔的列并添加以保存在新数据框中

在 Git 责备中显示提交 ID、更长的日期和行号