Python Pandas 日期转换问题

Posted

技术标签:

【中文标题】Python Pandas 日期转换问题【英文标题】:Python Pandas problem with date conversion 【发布时间】:2021-04-19 23:14:16 【问题描述】:

我给pandas 一个int 像这样:01142021223007,格式是'%m%d%Y%H%M%S'。这在 2020 年非常有效。例如:

12192020032906 -> 2020-12-19 03:29:06

自 2021 年以来,它给出了错误的日期:

01142021223007 -> 2021-11-04 22:30:07

应该是2021-01-14 22:30:07

代码:

self.df['time'] = pd.to_datetime(self.df['time'], format='%m%d%Y%H%M%S', errors = 'coerce')

我假设它只是跳过了01142020 开头的0,因此到达11 4 2020。有没有办法明确地说 MMDDYYYY? format ='%mm%dd%YYYY%HH%MM%SS' 不起作用。

我正在读取的 CSV 文件:

hum,moist,temp,time
81.1,40,26.30,12192020032906
83.1,38,25.80,12192020033006
85.6,39,25.30,12192020033106
87.3,38,24.90,12192020033206
89.4,38,24.50,12192020033306
90.2,38,24.20,12192020033407
90.9,39,23.90,12192020033506
91.5,38,23.70,12192020033607
92.2,38,23.40,12192020033706
...
57.0,15,25.60,01142021095906
53.6,47,24.30,01142021222407
53.7,44,24.30,01142021222419
54.1,45,24.30,01142021222540
54.9,43,24.30,01142021222706
55.2,43,24.20,01142021222806
55.5,44,24.20,01142021222906
55.7,43,24.20,01142021223007

生成的熊猫 df:

          hum  moist  temp                time
0      44.605     40  25.3 2020-12-19 03:29:06
1      45.705     38  24.8 2020-12-19 03:30:06
2      47.080     39  24.3 2020-12-19 03:31:06
3      48.015     38  23.9 2020-12-19 03:32:06
4      49.170     38  23.5 2020-12-19 03:33:06
...       ...    ...   ...                 ...
22387  29.755     45  23.3 2021-11-04 22:25:40
22388  30.195     43  23.3 2021-11-04 22:27:06
22389  30.360     43  23.2 2021-11-04 22:28:06
22390  30.525     44  23.2 2021-11-04 22:29:06
22391  30.635     43  23.2 2021-11-04 22:30:07

【问题讨论】:

“我给 pandas 一个 int” - 从哪里 - 从文件中读取它还是什么?显示minimal reproducible example。 在编辑中添加了 CSV 和 pandas df @ALollz 这很有道理,谢谢。从 csv 导入后我会转换列还是必须编辑 csv? 我会在 csv 中读取参数 dtype='time': 'str',这应该可以解决您的问题。没有那个 pandas 会尝试变得聪明,并将该列转换为 int,因为它们都是类似数字的值。 非常感谢,已答复! 【参考方案1】:

问题在于领先的0s。在阅读csv 时,pandas 会看到所有类似数字的值,并推断出最合适的 dtype 是int64。您可以通过指定列应保留为带有 dtype 参数的字符串来防止这种情况,保留前导 0,这将为您提供正确的格式。

#`data.csv`
hum,moist,temp,time
89.4,38,24.50,12192020033306
90.2,38,24.20,12192020033407
90.9,39,23.90,12192020033506
91.5,38,23.70,12192020033607
92.2,38,23.40,12192020033706
57.0,15,25.60,01142021095906
53.6,47,24.30,01142021222407
53.7,44,24.30,01142021222419
54.1,45,24.30,01142021222540

df = pd.read_csv('data.csv', dtype='time': 'str')
df['time_new'] = pd.to_datetime(df['time'], format='%m%d%Y%H%M%S', errors='coerce')

    hum  moist  temp            time            time_new
0  89.4     38  24.5  12192020033306 2020-12-19 03:33:06
1  90.2     38  24.2  12192020033407 2020-12-19 03:34:07
2  90.9     39  23.9  12192020033506 2020-12-19 03:35:06
3  91.5     38  23.7  12192020033607 2020-12-19 03:36:07
4  92.2     38  23.4  12192020033706 2020-12-19 03:37:06
5  57.0     15  25.6  01142021095906 2021-01-14 09:59:06
6  53.6     47  24.3  01142021222407 2021-01-14 22:24:07
7  53.7     44  24.3  01142021222419 2021-01-14 22:24:19
8  54.1     45  24.3  01142021222540 2021-01-14 22:25:40

如果没有 dtype 选项,前导 0 会被删除,这迫使 pandas 试图以某种方式找出 114 如何代表月份和日期,并决定使用第 11 个月和第 4 天

df = pd.read_csv('/Users/al686/Desktop/data.csv')  # time now int64 
df['time_new'] = pd.to_datetime(df['time'], format='%m%d%Y%H%M%S', errors='coerce')

    hum  moist  temp            time            time_new
0  89.4     38  24.5  12192020033306 2020-12-19 03:33:06
1  90.2     38  24.2  12192020033407 2020-12-19 03:34:07
2  90.9     39  23.9  12192020033506 2020-12-19 03:35:06
3  91.5     38  23.7  12192020033607 2020-12-19 03:36:07
4  92.2     38  23.4  12192020033706 2020-12-19 03:37:06
5  57.0     15  25.6   1142021095906 2021-11-04 09:59:06
6  53.6     47  24.3   1142021222407 2021-11-04 22:24:07
7  53.7     44  24.3   1142021222419 2021-11-04 22:24:19
8  54.1     45  24.3   1142021222540 2021-11-04 22:25:40

【讨论】:

【参考方案2】:

从文件中读取数据时可以传递date_parser

import pandas as pd
from datetime import datetime
   
df = pd.read_csv('your_file.csv', parse_dates=['time'],
                 date_parser=lambda x: datetime.strptime(x, '%m%d%Y%H%M%S'))
print(df)

输出

     hum  moist  temp                time
0   81.1     40  26.3 2020-12-19 03:29:06
1   83.1     38  25.8 2020-12-19 03:30:06
2   85.6     39  25.3 2020-12-19 03:31:06
3   87.3     38  24.9 2020-12-19 03:32:06
4   89.4     38  24.5 2020-12-19 03:33:06
5   90.2     38  24.2 2020-12-19 03:34:07
6   90.9     39  23.9 2020-12-19 03:35:06
7   91.5     38  23.7 2020-12-19 03:36:07
8   92.2     38  23.4 2020-12-19 03:37:06
9   57.0     15  25.6 2021-01-14 09:59:06
10  53.6     47  24.3 2021-01-14 22:24:07
11  53.7     44  24.3 2021-01-14 22:24:19
12  54.1     45  24.3 2021-01-14 22:25:40
13  54.9     43  24.3 2021-01-14 22:27:06
14  55.2     43  24.2 2021-01-14 22:28:06
15  55.5     44  24.2 2021-01-14 22:29:06
16  55.7     43  24.2 2021-01-14 22:30:07

【讨论】:

以上是关于Python Pandas 日期转换问题的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 时间戳字符串转换为 pandas 数据框中的 python 日期

将日期时间格式的索引转换为仅限日期的python pandas

如何使用空值将字符串转换为日期时间 - python,pandas?

Python/Pandas/Datetime:将列中的整个列表转换为日期时间

Python/pandas 导出到 excel 转换日期时间 (HH:mm)

使用 pandas python 将字符串日期转换为列中所有值的数字