【问题标题】:How to split csv into 2 dataframe with the condition如何根据条件将 csv 拆分为 2 个数据框
【发布时间】:2020-12-23 12:34:11
【问题描述】:

我的想法是将两个“字符串”分开,然后将两个数据帧转换为相同的日期时间格式。我试试代码

data['date'] = pd.to_datetime(data['date'])
data['date'] = data['date'].dt.strftime('%Y-%m-%d')

但输出有一些错误。 2020 年 2 月 13 日将变为 2020 年 2 月 13 日,这就是我想要的。但是 12/02/2020 将变为 2020-12-02。

我的数据框有 2 种日期格式。分别是 YYYY-MM-DD 和 DD/MM/YYYY。

dataframe

我需要将其拆分为 2 个数据框,将所有日期为 YYYY-MM-DD 的行放入 df1

数据类型为对象。

所有日期为DD/MM/YYYY的所有行都放入df2

有人知道怎么写代码吗?

【问题讨论】:

  • 您还需要将其转换为日期时间吗?
  • 我的想法是将两个“字符串”分开,然后将两个数据帧转换为相同的日期时间格式。我尝试了代码data['date'] = pd.to_datetime(data['date']),data['date'] = data['date'].dt.strftime('%Y-%m-%d'),但输出有一些错误。 2020 年 2 月 13 日将变为 2020 年 2 月 13 日,这就是我想要的。但是 12/02/2020 将变为 2020-12-02。
  • 我知道了,在EDIT添加了解决方案

标签: python pandas csv


【解决方案1】:

如果不需要转换为日期时间,请使用 Series.str.containsboolean indexing

mask = df['date'].str.contains('-')
df1 = df[mask].copy()
df2 = df[~mask].copy()

如果需要日期时间,如果格式不匹配,您可以使用to_datetime 中的参数errors='coerce' 获取缺失值,所以最后删除缺失值:

df1 = (df.assign(date = pd.to_datetime(df['date'], format='%Y-%m-%d', errors='coerce')
        .dropna(subset=['date']))

df2 = (df.assign(date = pd.to_datetime(df['date'], format='%d/%m/%Y', errors='coerce')
         .dropna(subset=['date']))

编辑:如果需要用正确的日期时间填充输出列,您可以用另一个Series 替换缺失值Series.fillna

date1 = pd.to_datetime(df['date'], format='%Y-%m-%d', errors='coerce')
date2 = pd.to_datetime(df['date'], format='%d/%m/%Y', errors='coerce')

df['date'] = date1.fillna(date2)

【讨论】:

  • EDIT(第二个)代码是正确的代码。谢谢你。 date1 = pd.to_datetime(df['date'], format='%Y-%m-%d', errors='coerce') date2 = pd.to_datetime(df['date'], format='%d/%m/%Y', errors='coerce') df['date'] = date1.fillna(date2)
【解决方案2】:

您可以使用分隔不同的事实来查找日期。

如果您的数据框采用这种格式:

 df = pd.DataFrame({'id' : [1,1,2,2,3,3], 
   "Date": ["30/8/2020","30/8/2021","30/8/2022","2019-10-24","2019-10-25","2020-10-24"] })

用“-”或“/”分隔数据

您可以使用查找此元素并将其应用于日期列的函数:

   def find(string):
       if string.find('/')==2:
     return True 
       else:
     return False

   df[df['date'].apply(find)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2019-06-14
    • 1970-01-01
    • 2020-11-08
    相关资源
    最近更新 更多