【问题标题】:Pandas date_parser function for year:doy:sod format年份:doy:sod 格式的 Pandas date_parser 函数
【发布时间】:2017-08-01 21:30:36
【问题描述】:

我有一个表格,其中日期和时间以year:day_of_year:seconds_of_day(第二列)的格式给出。可以在here找到一个示例文件

ABCD 15:010:00000 2564.6   4.0  -0.380  0.417  -1.313  0.520
ABCD 15:010:00300 2564.3   3.7  -0.389  0.396  -1.318  0.503
ABCD 15:010:00600 2563.9   3.5  -0.397  0.389  -1.324  0.496
ABCD 15:010:00900 2563.9   3.3  -0.411  0.368  -1.322  0.476
ABCD 15:010:01200 2563.8   3.0  -0.425  0.361  -1.320  0.466
ABCD 15:010:01500 2563.9   2.8  -0.432  0.340  -1.312  0.447
ABCD 15:010:01800 2564.3   2.6  -0.439  0.334  -1.304  0.439

我用pandas包把上面的表格放在pandas.DataFrame

names=['Site', 'Epoch', 'TroTot', 'Stdev','TgnTot', 'TgnStd', 'TgeTot', 'TgeStd']
parser = lambda x: pd.datetime.strptime(x, '%y:%j:%???')
df = pd.read_csv([FILE][1], 
                 header=None,
                 names=names,
                 delim_whitespace=True,
                 parse_dates=['Epoch'],
                 date_parser=parser)

我查看了文档,但在我看来,一天中的秒数没有格式。我怎样才能改变解析器函数以在这种格式下正常工作?

【问题讨论】:

    标签: python csv pandas datetime


    【解决方案1】:

    您可以先读取您的 CSV 文件(不解析日期):

    In [207]: df = pd.read_csv(fn, delim_whitespace=True, header=None, names=names)
    
    In [208]: df
    Out[208]:
         Site         Epoch  TroTot  Stdev  TgnTot  TgnStd  TgeTot  TgeStd
    0    ABCD  15:010:00000  2564.6    4.0  -0.380   0.417  -1.313   0.520
    1    ABCD  15:010:00300  2564.3    3.7  -0.389   0.396  -1.318   0.503
    2    ABCD  15:010:00600  2563.9    3.5  -0.397   0.389  -1.324   0.496
    3    ABCD  15:010:00900  2563.9    3.3  -0.411   0.368  -1.322   0.476
    4    ABCD  15:010:01200  2563.8    3.0  -0.425   0.361  -1.320   0.466
    5    ABCD  15:010:01500  2563.9    2.8  -0.432   0.340  -1.312   0.447
    6    ABCD  15:010:01800  2564.3    2.6  -0.439   0.334  -1.304   0.439
    7    ABCD  15:010:02100  2564.5    2.5  -0.453   0.314  -1.302   0.423
    8    ABCD  15:010:02400  2564.2    2.4  -0.467   0.309  -1.299   0.419
    9    ABCD  15:010:02700  2563.7    2.3  -0.482   0.287  -1.305   0.404
    ..    ...           ...     ...    ...     ...     ...     ...     ...
    278  ABCD  15:010:83400  2561.6    2.2   0.033   0.276  -0.894   0.416
    279  ABCD  15:010:83700  2562.1    2.2   0.053   0.271  -0.897   0.418
    280  ABCD  15:010:84000  2562.7    2.3   0.073   0.285  -0.899   0.431
    281  ABCD  15:010:84300  2562.6    2.3   0.108   0.283  -0.869   0.431
    282  ABCD  15:010:84600  2562.7    2.3   0.144   0.299  -0.839   0.442
    283  ABCD  15:010:84900  2562.4    2.3   0.175   0.298  -0.824   0.441
    284  ABCD  15:010:85200  2562.4    2.3   0.207   0.313  -0.810   0.450
    285  ABCD  15:010:85500  2562.1    2.3   0.228   0.314  -0.805   0.453
    286  ABCD  15:010:85800  2562.2    2.5   0.249   0.331  -0.801   0.467
    287  ABCD  15:010:86100  2562.6    2.7   0.253   0.337  -0.796   0.473
    
    [288 rows x 8 columns]
    

    现在你可以解析Epoch如下:

    In [209]: df['Epoch'] = pd.to_datetime(df['Epoch'].str[:6], format='%y:%j') + \
         ...:               pd.to_timedelta(df['Epoch'].str[7:].astype(int), unit='s')
         ...:
    
    In [210]: df
    Out[210]:
         Site               Epoch  TroTot  Stdev  TgnTot  TgnStd  TgeTot  TgeStd
    0    ABCD 2015-01-10 00:00:00  2564.6    4.0  -0.380   0.417  -1.313   0.520
    1    ABCD 2015-01-10 00:05:00  2564.3    3.7  -0.389   0.396  -1.318   0.503
    2    ABCD 2015-01-10 00:10:00  2563.9    3.5  -0.397   0.389  -1.324   0.496
    3    ABCD 2015-01-10 00:15:00  2563.9    3.3  -0.411   0.368  -1.322   0.476
    4    ABCD 2015-01-10 00:20:00  2563.8    3.0  -0.425   0.361  -1.320   0.466
    5    ABCD 2015-01-10 00:25:00  2563.9    2.8  -0.432   0.340  -1.312   0.447
    6    ABCD 2015-01-10 00:30:00  2564.3    2.6  -0.439   0.334  -1.304   0.439
    7    ABCD 2015-01-10 00:35:00  2564.5    2.5  -0.453   0.314  -1.302   0.423
    8    ABCD 2015-01-10 00:40:00  2564.2    2.4  -0.467   0.309  -1.299   0.419
    9    ABCD 2015-01-10 00:45:00  2563.7    2.3  -0.482   0.287  -1.305   0.404
    ..    ...                 ...     ...    ...     ...     ...     ...     ...
    278  ABCD 2015-01-10 23:10:00  2561.6    2.2   0.033   0.276  -0.894   0.416
    279  ABCD 2015-01-10 23:15:00  2562.1    2.2   0.053   0.271  -0.897   0.418
    280  ABCD 2015-01-10 23:20:00  2562.7    2.3   0.073   0.285  -0.899   0.431
    281  ABCD 2015-01-10 23:25:00  2562.6    2.3   0.108   0.283  -0.869   0.431
    282  ABCD 2015-01-10 23:30:00  2562.7    2.3   0.144   0.299  -0.839   0.442
    283  ABCD 2015-01-10 23:35:00  2562.4    2.3   0.175   0.298  -0.824   0.441
    284  ABCD 2015-01-10 23:40:00  2562.4    2.3   0.207   0.313  -0.810   0.450
    285  ABCD 2015-01-10 23:45:00  2562.1    2.3   0.228   0.314  -0.805   0.453
    286  ABCD 2015-01-10 23:50:00  2562.2    2.5   0.249   0.331  -0.801   0.467
    287  ABCD 2015-01-10 23:55:00  2562.6    2.7   0.253   0.337  -0.796   0.473
    
    [288 rows x 8 columns]
    

    检查:

    In [211]: df.dtypes
    Out[211]:
    Site              object
    Epoch     datetime64[ns]
    TroTot           float64
    Stdev            float64
    TgnTot           float64
    TgnStd           float64
    TgeTot           float64
    TgeStd           float64
    dtype: object
    

    【讨论】:

    • 精彩且速度惊人! ... 也非常感谢您展示如何使用 timedelta。
    • @AjanO,不客气。如果您认为 accepting 回答了您的问题,请考虑回答
    • 仅供参考,您不需要 to_timedelta 中的 astype
    • @Jeff,谢谢你的提示,但它给了我不同的结果——它忽略了unit='s' 参数。文档字符串说:denote the unit, which is an integer/float number
    • github.com/pandas-dev/pandas/issues/12136 是的,这是一个开放的错误 - 欢迎公关修复!
    【解决方案2】:

    对于您的数据格式,最简单的方法是将秒数添加到日期中。要将您的日期格式的解析器传递给pandas.read_csv(),您可以使用以下内容:

    代码:

    import datetime as dt
    def date_parser(date_string):
        date = dt.datetime.strptime(date_string[:6], '%y:%j')
        seconds = dt.timedelta(seconds=int(date_string[7:]))
        return date + seconds
    

    测试代码:

    from io import StringIO
    
    data = u"""
    ABCD 15:010:00000 2564.6   4.0  -0.380  0.417  -1.313  0.520
    ABCD 15:010:00300 2564.3   3.7  -0.389  0.396  -1.318  0.503
    ABCD 15:010:00600 2563.9   3.5  -0.397  0.389  -1.324  0.496
    ABCD 15:010:00900 2563.9   3.3  -0.411  0.368  -1.322  0.476
    ABCD 15:010:01200 2563.8   3.0  -0.425  0.361  -1.320  0.466
    ABCD 15:010:01500 2563.9   2.8  -0.432  0.340  -1.312  0.447
    ABCD 15:010:01800 2564.3   2.6  -0.439  0.334  -1.304  0.439
    """
    
    names=['Site', 'Epoch', 'TroTot', 'Stdev',
           'TgnTot', 'TgnStd', 'TgeTot', 'TgeStd']
    
    df = pd.read_csv(StringIO(data),
                     header=None,
                     names=names,
                     delim_whitespace=True,
                     parse_dates=['Epoch'],
                     date_parser=date_parser)
    print(df)
    

    结果:

       Site               Epoch  TroTot  Stdev  TgnTot  TgnStd  TgeTot  TgeStd
    0  ABCD 2015-01-10 00:00:00  2564.6    4.0  -0.380   0.417  -1.313   0.520
    1  ABCD 2015-01-10 00:05:00  2564.3    3.7  -0.389   0.396  -1.318   0.503
    2  ABCD 2015-01-10 00:10:00  2563.9    3.5  -0.397   0.389  -1.324   0.496
    3  ABCD 2015-01-10 00:15:00  2563.9    3.3  -0.411   0.368  -1.322   0.476
    4  ABCD 2015-01-10 00:20:00  2563.8    3.0  -0.425   0.361  -1.320   0.466
    5  ABCD 2015-01-10 00:25:00  2563.9    2.8  -0.432   0.340  -1.312   0.447
    6  ABCD 2015-01-10 00:30:00  2564.3    2.6  -0.439   0.334  -1.304   0.439
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      相关资源
      最近更新 更多