【问题标题】:CSV filename in date-form as Index日期格式的 CSV 文件名作为索引
【发布时间】:2018-03-19 20:44:34
【问题描述】:

我有几个标题为 yyyymmdd 的 csv 文件:。我还有几个 csv 文件包含“yyyymm”和一个包含“yyyy”的文件,我不想导入。

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

.

这是我的代码:

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 文件名相同?

【问题讨论】:

  • 就像你写的 csv 不包含任何日期......但是解析器将实际日期添加到解析时间,因此它是一个日期时间格式......你可以在文件名之后添加日期读取每个数据帧。
  • @Drise 感谢您的关注,我编辑了我的帖子

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


【解决方案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:

在下面的 cmets 中回答问题:

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

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

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

【讨论】:

  • @TimB,请删除您发布的答案,因为它违反了 stackoverflow 的准则。我鼓励您编辑您的问题并在底部添加新错误。
  • @TimB 能分享一下 pandas 和 python 的版本吗?
  • 当然,我使用的是 Python 3.6.4 和 Pandas 0.22
  • 谢谢,我想我发现了错误。我没有提到文件夹中还有 12 个 yyyymm 文件和 1 个 yyyy 文件。如果我删除这些文件没有错误,但是如果我返回数据帧,我会得到 'None' 。这是为什么?我编辑了我的帖子以使其更易于理解。
  • @TimB。确保使用 return df 复制完整的函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 2010-09-17
  • 2018-07-23
相关资源
最近更新 更多