【问题标题】:Reading CSV file in Pandas with historical dates在 Pandas 中读取具有历史日期的 CSV 文件
【发布时间】:2016-08-27 12:41:13
【问题描述】:

我正在尝试读取 (UK) 格式为 13/01/1800 的日期的文件,但是有些日期早于 1667 年,无法用纳秒时间戳表示(请参阅http://pandas.pydata.org/pandas-docs/stable/gotchas.html#gotchas-timestamp-limits)。我从该页面了解到,我需要创建自己的 PeriodIndex 以涵盖我需要的范围(请参阅http://pandas.pydata.org/pandas-docs/stable/timeseries.html#timeseries-oob),但我不明白如何将 csv 阅读器中的字符串转换为此 periodindex 中的日期。

到目前为止我有:

span = pd.period_range('1000-01-01', '2100-01-01', freq='D')
df_earliest= pd.read_csv("objects.csv", index_col=0, names=['Object Id', 'Earliest Date'], parse_dates=[1], infer_datetime_format=True, dayfirst=True)

如何将跨度应用于日期读取器/转换器,以便在数据框中创建 PeriodIndex / DateTimeIndex 列?

【问题讨论】:

  • 我认为最好加载并剥离斜线,然后您可以使用该链接中的方法创建一个 periodindex,因此在加载后执行 df['Earliest Date'] = df['Earliest Date'].str.replace('\\','') 所以我不会传递 parse_dates 参数read_csv 以将这些值作为字符串读取

标签: python date csv pandas


【解决方案1】:

你可以尝试这样做:

fn = r'D:\temp\.data\36987699.csv'

def dt_parse(s):
    d,m,y = s.split('/')
    return pd.Period(year=int(y), month=int(m), day=int(d), freq='D')


df = pd.read_csv(fn, parse_dates=[0], date_parser=dt_parse)

输入文件:

Date,col1
13/01/1800,aaa
25/12/1001,bbb
01/03/1267,ccc

测试:

In [16]: df
Out[16]:
        Date col1
0 1800-01-13  aaa
1 1001-12-25  bbb
2 1267-03-01  ccc

In [17]: df.dtypes
Out[17]:
Date    object
col1    object
dtype: object

In [18]: df['Date'].dt.year
Out[18]:
0    1800
1    1001
2    1267
Name: Date, dtype: int64

PS 你可能想在dt_parse() 函数中添加try ... catch 块以捕获ValueError: 异常-int() 的结果...

【讨论】:

  • 我已经用 try/except 包装了它,它会为无效的日期字符串返回 pd.NaT(否则拆分会崩溃)。
猜你喜欢
  • 2018-02-28
  • 2013-07-02
  • 1970-01-01
  • 2016-12-15
  • 2023-02-20
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多