从空间分隔的.dat文件获取日期时间-python/pandas

从空间分隔的.dat文件获取日期时间-python/pandas,python,pandas,datetime,dataframe,jupyter-notebook,Python,Pandas,Datetime,Dataframe,Jupyter Notebook,我正在尝试导入一个以空格分隔的.dat文件,使用pandas和strip值来创建日期。数据如下所示(三行数据取自整个数据集以供参考): 前六个数字组成日期(年、月、日、时、分、秒) 我可以使用以下方法导入数据: df = pd.read_csv('daily.dat', sep='\s+', header=None) 而且很好 但是,我想将行的前六个条目剥离为一个日期。例如,从第一行开始,前六个数字(或导入到df后的前六列)应为: 2014-01-01 00:00:00 帮助?演示: 当您读

我正在尝试导入一个以空格分隔的.dat文件,使用pandas和strip值来创建日期。数据如下所示(三行数据取自整个数据集以供参考):

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

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

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

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

2014-01-01 00:00:00
帮助?

演示:

当您读取一个没有列名(标题)的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')
可以从多个列组装datetime:

从数据帧的多个列组装日期时间。钥匙 可以是常见的缩写,如
['year','month','day','minute','second','ms','us','ns']
)或相同的复数形式

删除前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
或者(),我们可以这样做:

df = df.drop(columns=df.columns[:6])
您可以尝试以下方法:

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

你可能正在寻找一个答案很好的解决方案。我正在手动转换
日期时间
,但这要好得多。一条评论是最后一滴可能对某些人来说有点难读,我会使用
df.drop(columns=list(range(6)),inplace=True)
这是一个更详细的注释。@Idlehands,谢谢你的评论-我已经将它添加到了答案中!真管用!但是你能解释一下为什么设置“cols”吗?这些键是内置于to_datetime中的吗?为什么我不能直接将要转换为datetime的列发送到\u datetime?谢谢@spencerchad,答案中已经有了-Pandas
pd.to_datetime()
需要特定的列名-
键可以是常见的缩写,如['year','month','day','minute','second','ms','us','ns']),也可以是相同的复数,很可能您有一个更老的Pandas版本-我已经在Pandas 0.22.0下对其进行了测试
df = df.drop(columns=df.columns[:6])
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