Python 使用熊猫读取带有时间戳列的csv

Python 使用熊猫读取带有时间戳列的csv,python,csv,pandas,Python,Csv,Pandas,执行以下操作时: import pandas x = pandas.read_csv('data.csv', parse_dates=True, index_col='DateTime', names=['DateTime', 'X'], header=None, sep=';') 使用此data.csv文件: 1449054136.83;15.31 1449054137.43;16.19 1449054138.04;19.22

执行以下操作时:

import pandas
x = pandas.read_csv('data.csv', parse_dates=True, index_col='DateTime', 
                                names=['DateTime', 'X'], header=None, sep=';')
使用此
data.csv
文件:

1449054136.83;15.31
1449054137.43;16.19
1449054138.04;19.22
1449054138.65;15.12
1449054139.25;13.12
(第1列是UNIX时间戳,即自1970年1月1日起经过的秒数),当使用
x.resample('15S')
每隔15秒重新采样数据时,我会遇到此错误:

就像“日期时间”信息没有被解析一样:

                 X
DateTime      
1.449054e+09  15.31                
1.449054e+09  16.19
...
如何使用pandas模块导入日期存储为时间戳的.CSV?


然后,一旦我能够导入CSV,如何访问日期>2015-12-02 12:02:18的行

您可以自己解析日期:

import time
import pandas as pd

def date_parser(string_list):
    return [time.ctime(float(x)) for x in string_list]

df = pd.read_csv('data.csv', parse_dates=[0],  sep=';', 
                 date_parser=date_parser, 
                 index_col='DateTime', 
                 names=['DateTime', 'X'], header=None)
结果是:

>>> df
                        X
DateTime                  
2015-12-02 12:02:16  15.31
2015-12-02 12:02:17  16.19
2015-12-02 12:02:18  19.22
2015-12-02 12:02:18  15.12
2015-12-02 12:02:19  13.12

我的解决方案与Mike的类似:

import pandas
import datetime
def dateparse (time_in_secs):    
    return datetime.datetime.fromtimestamp(float(time_in_secs))

x = pandas.read_csv('data.csv',delimiter=';', parse_dates=True,date_parser=dateparse, index_col='DateTime', names=['DateTime', 'X'], header=None)

out = x.truncate(before=datetime.datetime(2015,12,2,12,2,18))

使用
来_datetime
并传递
unit='s'
来将单元解析为unix时间戳,这将快得多:

In [7]:
pd.to_datetime(df.index, unit='s')

Out[7]:
DatetimeIndex(['2015-12-02 11:02:16.830000', '2015-12-02 11:02:17.430000',
               '2015-12-02 11:02:18.040000', '2015-12-02 11:02:18.650000',
               '2015-12-02 11:02:19.250000'],
              dtype='datetime64[ns]', name=0, freq=None)
计时

In [9]:

import time
%%timeit
import time
def date_parser(string_list):
    return [time.ctime(float(x)) for x in string_list]
​
df = pd.read_csv(io.StringIO(t), parse_dates=[0],  sep=';', 
                 date_parser=date_parser, 
                 index_col='DateTime', 
                 names=['DateTime', 'X'], header=None)
100 loops, best of 3: 4.07 ms per loop


因此,在这个小数据集上使用
to_datetime
的速度要快2倍多,我希望它比其他方法的伸缩性好得多

非常感谢!那么(对于问题的第二部分),如何访问
df
的子部分,日期是>2015-12-02 12:02:18?(即过滤)非常感谢!您有没有关于如何访问日期为>2015-12-02 12:02:18的
x
行的示例?(即按日期过滤)熊猫的解决方案相当简单。我已经编辑了解决方案。你知道为什么我不能按建议使用它吗?我应该能够做
x.ix['2015-12-02 12:02:18':'2015-12-31 23:59:59']
x.loc[…]
,为什么它不能按建议工作?是不是因为datetime列不是索引?那么如何使其成为“索引”呢?我引用了这个,因为我发现它是解释问题和解决方案的最有用的资源:EdChum下面的答案在大型CSV文件上快了3倍多。我不知道为什么,但使用unit='s'时,熊猫会失去微秒精度(熊猫0.18.1)。传递
df.ts*1000,unit='ms'
会有帮助。@MikhailKorobov您必须发布原始数据和代码来演示这一点,因为我无法以其他方式进行评论。我认为这个问题与此重复。
In [9]:

import time
%%timeit
import time
def date_parser(string_list):
    return [time.ctime(float(x)) for x in string_list]
​
df = pd.read_csv(io.StringIO(t), parse_dates=[0],  sep=';', 
                 date_parser=date_parser, 
                 index_col='DateTime', 
                 names=['DateTime', 'X'], header=None)
100 loops, best of 3: 4.07 ms per loop
In [12]:
%%timeit
t="""1449054136.83;15.31
1449054137.43;16.19
1449054138.04;19.22
1449054138.65;15.12
1449054139.25;13.12"""
df = pd.read_csv(io.StringIO(t), header=None, sep=';', index_col=[0])
df.index = pd.to_datetime(df.index, unit='s')
100 loops, best of 3: 1.69 ms per loop