Python Pandas在read_csv中组合了timestamp列和fillna

时间:2014-11-29 23:42:47

标签: python csv numpy pandas timestamp

我正在阅读带有Pandas的csv文件。格式为:

Date        Time        x1      x2     x3     x4    x5
3/7/2012    11:09:22    13.5    2.3    0.4    7.3   6.4
                        12.6    3.4    9.0    3.0   7.0
                        3.6     4.4    8.0    6.0   5.0
                        10.6    3.5    1.0    3.0   8.0
...
3/7/2012    11:09:23    10.5    23.2   0.3    7.8   4.4
                        11.6    13.4   19.0   13.0  17.0
...

如您所见,并非每一行都有时间戳。没有时间戳的每一行与其上面最接近的行有1秒的时间间隔。它有一个时间戳。

我正在尝试做三件事: 1.组合日期和时间列以获取单个时间戳列。 2.将该列转换为以秒为单位。 3.填充空单元格以获得适当的时间戳。 所需的最终结果是一个数组,其中包含每行的时间戳(以秒为单位)。

我不确定如何快速将时间戳转换为秒数单位,然后再进行缓慢的for循环并使用Python内置的time.mktime方法。

然后,当我填写缺少的时间戳值时,问题是日期和时间列中没有时间戳的单元格都会得到一个" nan"值和合并时给出一个值为" nan nan"的单元格。然后,当我使用fillna()方法时,它并没有解释" nan nan"作为一个南方。

我使用以下代码来获取问题结果(不包括尝试转换为秒的部分):

import pandas as pd
df = pd.read_csv('file.csv', delimiter=',', parse_dates={'CorrectTime':[0,1]}, usecols=[0,1,2,4,6], names=['Date','Time','x1','x3','x5'])
df.fillna(method='ffill', axis=0, inplace=True)

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

假设你需要自1900年1月1日起的秒数......

import pandas
from io import StringIO
import datetime
data = StringIO("""\
Date,Time,x1,x2,x3,x4,x5
3/7/2012,11:09:22,13.5,2.3,0.4,7.3,6.4
,,12.6,3.4,9.0,3.0,7.0
,,3.6,4.4,8.0,6.0,5.0
,,10.6,3.5,1.0,3.0,8.0
3/7/2012,11:09:23,10.5,23.2,0.3,7.8,4.4
,,11.6,13.4,19.0,13.0,17.0
""")

df = pandas.read_csv(data, parse_dates=['Date']).fillna(method='ffill')

def dealwithdates(row):
    datestring = row['Date'].strftime('%Y-%m-%d')
    dtstring = '{} {}'.format(datestring, row['Time'])
    date = datetime.datetime.strptime(dtstring, '%Y-%m-%d %H:%M:%S')

    refdate = datetime.datetime(1900, 1, 1)
    return (date - refdate).total_seconds()

df['ordinal'] = df.apply(dealwithdates, axis=1)
print(df)

        Date      Time    x1    x2    x3    x4    x5     ordinal
0 2012-03-07  11:09:22  13.5   2.3   0.4   7.3   6.4  3540107362
1 2012-03-07  11:09:22  12.6   3.4   9.0   3.0   7.0  3540107362
2 2012-03-07  11:09:22   3.6   4.4   8.0   6.0   5.0  3540107362
3 2012-03-07  11:09:22  10.6   3.5   1.0   3.0   8.0  3540107362
4 2012-03-07  11:09:23  10.5  23.2   0.3   7.8   4.4  3540107363
5 2012-03-07  11:09:23  11.6  13.4  19.0  13.0  17.0  3540107363