从空格分隔的 .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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章