python - 连接 Pandas 日期时间

标签 python datetime python-3.x pandas

我有这个问题的解决方案,实际上有 2 个解决方案,但我对它们不满意。原因是我试图读取的文件有大约 1200 万行,使用这些解决方案,处理它们需要花费大量时间。主要是解法是逐行运算。

所以,我是这样读取文件的:

In  [1]: df = pd.read_csv('C:/Projects/NPMRDS/FHWA_TASK2-4_NJ_09_2013_TT.CSV')
         df.head()

Out [1]:     TMC        DATE    EPOCH   Travel_TIME_ALL_VEHICLES    Travel_TIME_PASSENGER_VEHICLES  Travel_TIME_FREIGHT_TRUCKS
         0   103N04152  9252013 211     12                          12                              NaN
         1   103N04152  9262013 0       7                           7                               NaN
         2   103N04152  9032013 177     8                           8                               NaN
         3   103N04152  9042013 176     8                           9                               7

我的问题是 DATEEPOCH 列。我想将它们合并到一个日期时间列中。

  • DATE 采用 '%m%d%Y' 格式(缺少前导零)

  • EPOCH 是一天的 5 分钟纪元:

     Time        EPOCH
     00:00:00 => 0
     00:05:00 => 1
     ...
     ...
     12:00:00 => 144
     12:05:00 => 145
     ...
     ...
     23:50:00 => 286
     23:55:00 => 287
    

我想要的是这样的:

In  [2]: df.head()

Out [2]:     TMC        DATE_TIME           DATE    EPOCH   Travel_TIME_ALL_VEHICLES    Travel_TIME_PASSENGER_VEHICLES  Travel_TIME_FREIGHT_TRUCKS
         0   103N04152  2013-09-25 17:35:00 9252013 211     12                          12                              NaN
         1   103N04152  2013-09-26 00:00:00 9262013 0       7                           7                               NaN
         2   103N04152  2013-09-03 14:45:00 9032013 177     8                           8                               NaN
         3   103N04152  2013-09-04 14:30:00 9042013 176     8                           9                               7

现在,我可以通过执行以下三项操作中的任何一项来逐行执行此操作:

In  [3]: df = pd.read_csv('C:/Projects/NPMRDS/FHWA_TASK2-4_NJ_09_2013_TT.CSV',
                 converters={'DATE': lambda x: datetime.datetime.strptime(x, '%m%d%Y'),
                             'EPOCH': lambda x: str(datetime.timedelta(minutes = int(x)*5))},
                 parse_dates = {'date_time': ['DATE', 'EPOCH']},
                 keep_date_col = True)
         df.head()

Out [3]:    date_time           TMC         DATE        EPOCH       Travel_TIME_ALL_VEHICLES    Travel_TIME_PASSENGER_VEHICLES  Travel_TIME_FREIGHT_TRUCKS
         0  2013-09-25 17:35:00 103N04152   2013-09-25  17:35:00    12                          12                              NaN
         1  2013-09-26 00:00:00 103N04152   2013-09-26  00:00:00    7                           7                               NaN
         2  2013-09-03 14:45:00 103N04152   2013-09-03  14:45:00    8                           8                               NaN
         3  2013-09-04 14:40:00 103N04152   2013-09-04  14:40:00    8                           9                               7
         4  2013-09-05 09:35:00 103N04152   2013-09-05  09:35:00    10                          10                              NaN

在这种方法中,我丢失了 DATEEPOCH 的原始格式,但它并没有真正影响数据帧的进一步计算。我可以使用 date_parser 而不是使用 converters 作为参数。或者,在读取数据后,类似于第 1 行,我可以这样做:

In  [4]: df = pd.read_csv('C:/Projects/NPMRDS/FHWA_TASK2-4_NJ_09_2013_TT.CSV')
         df['date_time'] = pd.to_datetime([datetime.datetime.strptime(str(df['DATE'][x]), '%m%d%Y') + datetime.timedelta(minutes = int(df['EPOCH'][x]*5)) for x in range(len(df))])
         df.head()

Out [4]:    TMC         DATE    EPOCH   Travel_TIME_ALL_VEHICLES    Travel_TIME_PASSENGER_VEHICLES  Travel_TIME_FREIGHT_TRUCKS  DATE_TIME
         0  103N04152   9252013 211     12                          12                              NaN                         2013-09-25 17:35:00
         1  103N04152   9262013 0       7                           7                               NaN                         2013-09-26 00:00:00
         2  103N04152   9032013 177     8                           8                               NaN                         2013-09-03 14:45:00
         3  103N04152   9042013 176     8                           9                               7                           2013-09-04 14:40:00
         4  103N04152   9052013 115     10                          10                              NaN                         2013-09-05 09:35:00

一个更理想的结果(不要担心列顺序),但仍然是逐行,并且需要大量时间。

然后是pandas.to_datetimepandas.to_timedelta,它们的运行速度比上述方法快得多。但是我不能在不求助于字符串函数的情况下将结果合并在一起,这又主要是逐行。 有谁知道更好的方法吗?

最佳答案

试试看 - 在 400 万行测试数据上,我的运行时间减少到大约 1 秒(与 15 秒相比)。

df = pd.read_csv('temp.csv')

df['DATE'] = pd.to_datetime(df['DATE'], format='%m%d%Y')
df['EPOCH'] = pd.to_timedelta((df['EPOCH'].astype(int) * 5).astype('timedelta64[m]'))
df['DATE_TIME'] = df['DATE'] + df['EPOCH']

关于python - 连接 Pandas 日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24978394/

相关文章:

python - 更改多个文件的后缀

python - 按列表中元组的顺序将多个元组列表组合成新的元组列表(python3)

python - 如何在 Python 中将制表符分隔、管道分隔转换为 CSV 文件格式

python - 用于拼接列表的单行

Python Google Drive API - 获取我的云端硬盘文件夹的 ID

javascript - 如何格式化日期时间

mysql - mysql 5.5.46和5.6.28中datetime类型的区别

python - 我有 skimage 版本 0.12。我想专门下载0.14版本。我怎么做?

python - 反复从 Python 中读取 CSV?

c# - 在 noda time LocalDate 和 Datetime 之间转换的最佳方法?