【问题标题】:Changing the format of a column of Data frame from Str to Date in specific format以特定格式将数据框列的格式从 Str 更改为 Date
【发布时间】:2016-11-14 17:28:11
【问题描述】:

我有两个数据框,我必须在 Date 上合并它们。 但数据类型不一样。它们是日期和 str 格式。

print(visit_data.iloc[0]['visit_date'])
2016-05-22

type(visit_data.iloc[0]['visit_date'])
Out[40]: datetime.date

print(holiday_data.iloc[0]['visit_date'])
1/1/2016

type(holiday_data.iloc[0]['visit_date'])
Out[46]: str

所以这是类型和格式。现在我正在使用它来合并。

    data_store = pd.merge(data_store, holiday_data, how = 'left' , on = ['visit_date','State']).reset_index(drop=True)

合并正在进行,因为有 2 个键,但数据没有输出,这可能是由于 visit_date 的格式不同。 所以,我试图通过这个来改变它。

holiday_data['visit_date'] = pd.to_datetime(holiday_data['visit_date'], format = 'format="%m/%d/%Y')

但这给了

print(holiday_data.iloc[0]['visit_date'])
2016-01-01 00:00:00

type(holiday_data.iloc[0]['visit_date'])
Out[54]: pandas.tslib.Timestamp

这不是我想要的。

我正在更改holiday_data 的数据类型,因为data_store 的长度很长。那么有什么帮助可以解决这个问题吗?我正在使用python2.7

【问题讨论】:

  • 不应该是%d/%m/%Y吗?
  • @NickilMaveli format = '%Y-%m-%d' 是我想要的格式,因为visit_data['visit_date'] 的格式是 So。
  • format 参数是为了帮助to_datetime 确定参数,它的显示方式是完全独立的操作,因为您可以使用dt.strftime,但这会返回一个字符串而不是日期时间跨度>
  • @EdChum 我误解了功能,我现在已经编辑了问题,请看一下。
  • 为什么显示的格式在这里很重要?您希望将数据保留为算术运算的日期时间 dtype,如果您想要不同的格式,则可以调用 dt.strftime('"%m/%d/%Y') 以添加所需格式的新字符串列

标签: python python-2.7 pandas merge


【解决方案1】:

如果您希望它作为 datetime 对象返回,您可以这样做:

import datetime 

holiday_data['visit_date'] = holiday_data['visit_date'].apply(lambda x: 
                                    datetime.datetime.strptime(x,'%m/%d/%Y'))

编辑:

要仅从 datetime 对象中检索日期,请使用 dt accessor

工作示例:

In [2]: df = pd.DataFrame(['1/1/2016', '1/2/2016', '1/3/2016', '1/4/2016', '1/5/2016'], columns=['Mycol'])

In [3]: df['Mycol'] = df['Mycol'].apply(lambda x: datetime.datetime.strptime(x,'%m/%d/%Y')).dt.date

In [4]: df
Out[4]: 
        Mycol
0  2016-01-01
1  2016-01-02
2  2016-01-03
3  2016-01-04
4  2016-01-05

In [5]: df.iloc[0]['Mycol']
Out[5]: datetime.date(2016, 1, 1)

In [6]: type(df.iloc[0]['Mycol'])
Out[6]: datetime.date

【讨论】:

  • 我也做了同样的事情,我只写了有问题的输出。
  • 已经尝试了相同的holiday_data['visit_date'] = holiday_data['visit_date'].apply(lambda x: datetime.datetime.strptime(x,'%m/%d/%Y')) type(holiday_data.iloc[65]['visit_date']) Out[72]: pandas.tslib.Timestamp print(holiday_data.iloc[65]['visit_date']) 2016-01-02 00:00:00 仍然是相同的输出
  • 为什么不试试更新的答案,看看你是否真的得到了你想要的?
  • 你确定它有效吗?因为对我来说它给了我错误,AttributeError: 'Series' object has no attribute 'datetime'
  • 糟糕。可能是因为我将datetime 导入为dt 并且还使用了dt 访问器。因此出现了这个错误。我已经更正了。
猜你喜欢
  • 1970-01-01
  • 2020-04-13
  • 2022-01-16
  • 2020-04-08
  • 1970-01-01
  • 2021-09-01
  • 2020-07-15
  • 2021-04-14
  • 2019-09-15
相关资源
最近更新 更多