日期格式的CSV文件名为索引

时间:2018-03-19 20:44:35

标签: python python-3.x pandas csv datetime

我有几个csv文件标题为yyyymmdd:'yyyymmdd'。我还有几个csv文件有' yyyymm'和一个有' yyyy'我想要导入。

问题是,csv文件本身只有时间而不是日期:

datetimeformat

这是我的代码:

import pandas as pd
from glob import glob

photolist = glob('********.csv')

dataframes = [pd.read_csv(Tage, delimiter=';',
                    skiprows=2,
                    encoding='cp1252',
                    parse_dates = True,
                    index_col = 0) for Tage in photolist]


print(dataframes)

数据帧的索引返回正确的时间,但不是正确的日期。

所以我的问题是:我怎样才能拥有与csv filname相同的索引日期?

1 个答案:

答案 0 :(得分:1)

您需要指定文件名的日期,而不是pandas自动定义的日期。

如何做到这一点:

import pandas as pd
from glob import glob

photolist = glob('*.csv')
def load_dataframe(path):
    df = pd.read_csv(path, delimiter=';',
                    skiprows=2,
                    encoding='cp1252',
                    parse_dates = True,
                    index_col = 0)

    df = df.set_index(pd.to_datetime(
             path.split(".")[0] +" " + df.index.to_series().dt.time.astype(str)))
    return df 

dataframes = [load_dataframe(Tage) for Tage in photolist]

说明:

与您的解决方案相比,唯一不同的是:

df.set_index(pd.to_datetime(
             path.split(".")[0] +" " + df.index.to_series().dt.time.astype(str)))

让我们用一个例子来解释它:

给定数据帧df,它具有日期时间索引:

                     column
2017-08-12 08:00:00       1
2017-08-12 09:15:12       2
2017-08-12 10:45:23       3

我们可以将日期从2017-08-12更改为2019-10-11,如下所示:

df.set_index(pd.to_datetime(
    "20191011" + " "+ df.index.to_series().dt.time.astype(str))) 

输出:

                     column
2019-10-11 08:00:00       1
2019-10-11 09:15:12       2
2019-10-11 10:45:23       3

编辑:回答OP的错误

错误消息指向问题ValueError: month must be in 1..12

因此,pd.to_datetime无法推断出正确的日期格式,或者您的数据中有错误的日期。假设您的数据是正确的,以下是您可以明确指定日期格式的方法:

df.set_index(pd.to_datetime(
             path.split(".")[0] +" " + df.index.to_series().dt.time.astype(str),
             format = '%Y%m%d %H:%M:%S'))

编辑2:

在下面的评论中回答问题:

  

知道如何在不删除yyyymm和yyyy文件的情况下运行代码吗?

您可以按如下方式使用列表理解:

photolist = glob('*.csv')
photolist = [i for i in photolist if len(i) == 12]