【问题标题】:Python: Mixed date format in data frame columnPython:数据框列中的混合日期格式
【发布时间】:2021-09-14 06:06:16
【问题描述】:

我有一个跨列和列内混合日期格式的数据框。尝试将它们从对象转换为日期时间类型时,由于 date1 列具有混合格式,我收到错误消息。在这种情况下,我看不出如何解决它。另外,如何从两列(date1 和 date2)中删除秒数?

这是我尝试的代码:

df = pd.DataFrame(np.array([[10, "2021-06-13 12:08:52.311 UTC", "2021-03-29 12:44:33.468"], 
                            [36, "2019-12-07 12:18:02 UTC", "2011-10-15 10:14:32.118"]
                           ]),
                   columns=['col1', 'date1', 'date2'])
df

>>
   col1 date1                        date2
0   10  2021-06-13 12:08:52.311 UTC  2021-03-29 12:44:33.468
1   36  2019-12-07 12:18:02 UTC      2011-10-15 10:14:32.118


# Converting from object to datetime
df["date1"]= pd.to_datetime(df["date1"], format="%Y-%m-%d %H:%M:%S.%f UTC")
df["date2"]= pd.to_datetime(df["date2"], format="%Y-%m-%d %H:%M:%S.%f")

>>
ValueError: time data '2019-12-07 12:18:02 UTC' does not match format '%Y-%m-%d %H:%M:%S.%f UTC' (match)

【问题讨论】:

  • df["date1"]= pd.to_datetime(df["date1"].str.strip('UTC'), format="%Y-%m-%d %H:%M:%S.%f", utc = True) ??或df["date1"]= pd.to_datetime(df["date1"], infer_datetime_format =True)
  • 这行得通,但最终放置的 .%f 值与之前的行相同。这就是为什么我一直想知道简单地删除两列的秒数是否会更方便。这怎么可能做到?

标签: pandas dataframe datetime format timezone


【解决方案1】:

对于转换为日期时间,我发现 infer_datetime_format 很有帮助。 无法让它在完整的数据帧上工作,它能够一次转换一列。

In [19]: pd.to_datetime(df["date1"], infer_datetime_format=True)                                                                                                                                                                                                                                   
Out[19]: 
0   2021-06-13 12:08:52.311000+00:00
1          2019-12-07 12:18:02+00:00
Name: date1, dtype: datetime64[ns, UTC]

In [20]: pd.to_datetime(df["date2"], infer_datetime_format=True)                                                                                                                                                                                                                                   
Out[20]: 
0   2021-03-29 12:44:33.468
1   2011-10-15 10:14:32.118
Name: date2, dtype: datetime64[ns]

如果至少所有格式都以这种格式 "%Y-%m-%d %H:%M" 开头,那么您可以将所有字符串切片并使用它们

In [32]: df['date1'].str.slice(stop=16)                                                                                                                                                                                                                                                            
Out[32]: 
0    2021-06-13 12:08
1    2019-12-07 12:18
Name: date1, dtype: object

为了摆脱日期时间值中的秒数,而不是简单地摆脱这些值,您可以使用 round ,您还可以检查 floor 和 ceil 更适合您的用例。

In [28]: pd.to_datetime(df["date1"], infer_datetime_format=True).dt.round('T')                                                                                                                                                                                                                     
Out[28]: 
0   2021-06-13 12:09:00+00:00
1   2019-12-07 12:18:00+00:00
Name: date1, dtype: datetime64[ns, UTC]

In [29]: pd.to_datetime(df["date2"], infer_datetime_format=True).dt.round('T')                                                                                                                                                                                                                     
Out[29]: 
0   2021-03-29 12:45:00
1   2011-10-15 10:15:00
Name: date2, dtype: datetime64[ns]

【讨论】:

  • df.set_index('col1').apply(lambda x: pd.to_datetime(x, infer_datetime_format= True).dt.round('T')) 这将适用于完整的df :)
  • 我需要两者具有完全相同的格式...在进行舍入时,您可以看到 date1 为 00+00:00,date2 为 00...我正在寻找它们看起来相同或完全消失的方式......
  • 没关系!如果您设置 utc = False ,则使用上面的代码,然后将其工作的秒数舍入。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多