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】:
问题在于领先的0
s。在阅读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:将列中的整个列表转换为日期时间