【问题标题】:Converting dates within the pandas data structure format在 pandas 数据结构格式中转换日期
【发布时间】:2023-04-04 04:35:02
【问题描述】:

所以我使用 pandas 打开了 .csv 格式的数据。我现在想将日期从当前的 dd/mm/YYYY hh:mm:ss 格式重新格式化为纯 YYYY-mm-dd 格式,例如,从 19/11/2014 15:26:13 到 2014-11- 19.我将如何在 pandas 数据数组中执行此操作?即,从此转换:

          Id  User Id           Start Time             End Time  Climb Time
0      74618    27366  19/11/2014 15:26:13  19/11/2014 15:26:18           5   
1      74632    27366  19/11/2014 15:26:18  19/11/2014 15:42:26         968   
2      74633    27366  19/11/2014 15:42:26  19/11/2014 15:42:48          22

到这里:

          Id  User Id  Start Time    End Time  Climb Time
0      74618    27366  2014-11-19  2014-11-19           5   
1      74632    27366  2014-11-19  2014-11-19         968   
2      74633    27366  2014-11-19  2014-11-19          22

我尝试了另一种 pandas 就绪方法,但似乎都没有工作或识别初始数据。我想知道是否有人知道可以实现此目的的任何方法...

【问题讨论】:

  • 对不起,您是在问如何正确解析日期字符串,还是在此处询问重新格式化,因为前者df['Start Time'] = pd.to_datetime(df['Start Time']) 将适用于后者,转换后您可以执行df['Start Time'].dt.strftime('%Y-%m-%d') 但是,这将给你字符串而不是日期或日期时间对象,它不如正确的日期时间 IMO 有用
  • @reticentroot 该示例适用于to.csv 而不是from.csv。 @EdChum 我会采用任何可行的方法——df 是什么?我希望对此进行更明确的解释,而不仅仅是“这样做——它有效”——我想知道发生了什么。
  • @EdChum 这也给了我:TypeError: 'type' object has no attribute '__getitem__'
  • 这里df 指的是一个数据框,我假设您使用read_csv 创建了一个df,如下所示:df = pd.read_csv(your_file_path),您实际上可以告诉pandas 解析这些列:df = pd.read_csv(your_file, parse_dates=['Start Time', 'End Time'])您也没有说明您当前的游戏状态是什么,您的问题是如何在熊猫数据数组中执行此操作,这意味着它已经被加载到数据框中,如果没有,那么您应该发布原始数据,您的代码并试图消除任何歧义
  • @EdChum 好的,这开始有意义了。 dt 是什么?

标签: python arrays datetime pandas format


【解决方案1】:

让我试一试,看看它是否是您想要的。

输入 CSV 是这样的(在这个例子中我称之为 test.csv)

Id,User Id,Start Time,End Time,Climb Time
74618,27366,19/11/2014 15:26:13,19/11/2014 15:26:18,5   
74632,27366,19/11/2014 15:26:18,19/11/2014 15:42:26,968   
74633,27366,19/11/2014 15:42:26,19/11/2014 15:42:48,22

现在来自 iPython 的一些输入/输出。

In [1]: import pandas as pd

In [2]: df = pd.read_csv('test.csv')

我们可以看看转换为日期时间。注意我们最后得到的“类型”。

In [5]: pd.to_datetime(df['Start Time'])
Out[5]: 
0   2014-11-19 15:26:13
1   2014-11-19 15:26:18
2   2014-11-19 15:42:26
Name: Start Time, dtype: datetime64[ns]

现在您可以将其保存回新列。 to_datetime 在获取日期和时间部分方面非常聪明。如果您的日期错误,您可以使用 format key-word 指定输入日期时间的格式

df['start_dt'] = pd.to_datetime(df['Start Time'])

最后,您可以检查数据框中列的 dtypes:

In [9]: df.dtypes
Out[9]: 
Id                     int64
User Id                int64
Start Time            object
End Time              object
Climb Time             int64
start_dt      datetime64[ns]
dtype: object

现在这个新列,它是一个日期时间对象,您可以按照您喜欢的任何方式显示或排序它。从您的 OP 看来,您似乎只想获取日期部分。这很简单,你可以这样做(来自this post

In [10]: df['start_dt'].dt.date
Out[10]: 
0    2014-11-19
1    2014-11-19
2    2014-11-19
Name: start_dt, dtype: object

现在我们可以将所有这些放在一起并进行转换,然后将其作为日期放在一行中。看来你想回收列名,所以我在这里这样做,但没有必要。您可以为“新”列指定任何您想要的名称。

In [13]: df['Start Time'] = pd.to_datetime(df['Start Time']).dt.date

In [14]: df['End Time'] = pd.to_datetime(df['End Time']).dt.date

In [15]: df
Out[15]: 
      Id  User Id  Start Time    End Time  Climb Time    start_dt
0  74618    27366  2014-11-19  2014-11-19           5  2014-11-19
1  74632    27366  2014-11-19  2014-11-19         968  2014-11-19
2  74633    27366  2014-11-19  2014-11-19          22  2014-11-19

我认为结果就是您想要的。

【讨论】:

    【解决方案2】:

    试试这个:

    pd.to_datetime(df['Start Time']).dt.date
    

    或者如果你希望你的列类型是字符串:

    pd.to_datetime(df.StartTime).dt.strftime('%Y-%m-%d')
    

    【讨论】:

    • Top 方法有效 - 但首先使用 df = df.sort('End Time') 然后 df['End Time'] = pandas.to_datetime(df['End Time']).dt.date pyplot.plot(['End Time'],['Calories']) 吐出 ValueError: could not convert string to float: End Time...所以 matplotlib 不喜欢这种格式。我需要能够通过matplotlib对其进行排序和使用。
    • 这是一个不同的问题,您可以更新您的原始问题并添加此问题或创建一个新问题吗?
    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    相关资源
    最近更新 更多