pandas 我想从格式为YYMMDD和HHMMSS的txt文件中提取2列,并创建格式为'YY-MM-DD HH:MM:SS'的日期时间

slwdgvem  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(107)

使用Python/Pandas,我需要从
0 20100301 000000 0.89894000000 0.89919000000 0.898940000 0.89916000000000014
1 20100301 000100 0.89918000000 0.89919000000 0.898970000 0.8989700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0/1是前两行的索引。20100301是日期,000000/000100是时间。即000100是午夜后一分钟。
救命啊!
我已经试过了所有的方法!

avwztpqn

avwztpqn1#

你的txt文件没有头,有很多不必要的列,所以我创建了一个新的例子。如果你的原始数据没有头,在pd.read_csv中使用header=None

回答

当CSV文件的前3行为以下内容时:

date time val1
20100301 000000 1
20100301 000001 2

字符串
您可以通过以下方式组合第一列和第二列来创建日期时间。(在your_file_path处输入您的文件路径)

import pandas as pd
df = pd.read_csv(your_file_path, sep='\s+', parse_dates={'datetime':[0, 1]})


[0, 1]表示示例文件中日期和时间的位置。
DF

datetime            val1
0   2010-03-01 00:00:00 1
1   2010-03-01 00:00:01 2


要在不创建文件的情况下简单地检查它,请使用以下代码。

import pandas as pd
import io
txt = '''date time val1
20100301 000000 1
20100301 000001 2'''
df = pd.read_csv(io.StringIO(txt), sep='\s+', parse_dates={'datetime':[0, 1]})


io.StringIO make string like file.所以你可以得到相同的结果

ctrmrzij

ctrmrzij2#

让我们来玩琴弦。

在这里,我们将使用传统的方法来做这项工作。

**1.预处理:**假设您的数据保存为*.txt文件,如下所示:

0 20100301 000000 0.89894000000 0.89919000000 0.898940000 0.89916000000 0000000014
1 20100301 000100 0.89918000000 0.89919000000 0.898970000 0.89897000000 0000000015

字符串

2.以csv格式读取文件:

file_path = "Documents/data.txt" # based on your file address
df = pd.read_csv(file_path, sep=" ", header=None, dtype={1:str, 2:str})


这些论点是什么意思?

sep:列分隔符,这里是空格(" ")。
header:这里我们的数据文件没有头(列没有任何名称)
dtype:包含日期和时间值的第1列和第2列是字符串。如果您忽略了dtypespandas将以整数形式读取这些列,并将000100存储为100

要深入了解这些参数,请阅读documents
现在我们有了这个:

>>> df
   0         1       2        3        4        5        6   7
0  0  20100301  000000  0.89894  0.89919  0.89894  0.89916  14
1  1  20100301  000100  0.89918  0.89919  0.89897  0.89897  15

**3.字符串操作:**获取日期和时间数据,精确到您想要的格式:

>>> df[1].str[:4]
0    2010
1    2010
Name: 1, dtype: object
>>> df[1].str[4:6]
0    03
1    03
Name: 1, dtype: object
>>> df[1].str[6:]
0    01
1    01
Name: 1, dtype: object


对于时间数据:

>>> df[2].str[:2]
0    00
1    00
Name: 2, dtype: object
>>> df[2].str[2:4]
0    00
1    01
Name: 2, dtype: object
>>> df[2].str[4:]
0    00
1    00
Name: 2, dtype: object

**重要提示:**通过调用.str属性,我们告诉Python我们需要对列的每一行进行字符串操作,如.join()或'split()等。

现在我们根据您的格式添加字符串:

>>> df[1].str[:4]+"-"+df[1].str[4:6]+"-"+df[1].str[6:]+" "+df[2].str[:2]+":"+df[2].str[2:4]+":"+df[2].str[4:]
0    2010-03-01 00:00:00
1    2010-03-01 00:01:00
dtype: object


这是“YYYY-MM-DD HH:MM:SS”格式,如果您希望它改为“YY-MM-DD HH:MM:SS”,请将年份部分更改为df[1].str[2:4]
将结果保存到新列中:

df[8] = df[1].str[:4]+"-"+df[1].str[4:6]+"-"+df[1].str[6:]+" "+df[2].str[:2]+":"+df[2].str[2:4]+":"+df[2].str[4:]


干杯!干杯!

jtw3ybtb

jtw3ybtb3#

您只需要使用 datetime 模块,特别是它的 strftime()strptime() 函数。

from datetime import datetime as DT

with open("foo.txt") as data:
    for line in map(str.strip, data):
        if line: # make sure it's not a blank line
            _, d, t, *_ = line.split()
            # parse the data
            p = DT.strptime(f"{d}{t}", "%Y%m%d%H%M%S")
            # format the datetime
            print(DT.strftime(p, "%y-%m-%d %H:%M:%S"))

字符串

输出:

10-03-01 00:00:00
10-03-01 00:01:00

相关问题